我参考这个例子写了自己的ListView适配器我现在单击那个按钮后,希望显示出相关的ListView的一项的信息。
而不是每项都是一样的。
请问应该怎么修改啊?public void showInfo(){          new AlertDialog.Builder(this)          .setTitle("我的listview")          .setMessage("介绍...")          .setPositiveButton("确定", new DialogInterface.OnClickListener() {              @Override              public void onClick(DialogInterface dialog, int which) {              }          })          .show();                 } 
         public class MyAdapter extends BaseAdapter{  
    
         private LayoutInflater mInflater;  
            
            
         public MyAdapter(Context context){  
             this.mInflater = LayoutInflater.from(context);  
         }  
         @Override 
         public int getCount() {  
             // TODO Auto-generated method stub  
             return mData.size();  
         }  
    
         @Override 
         public Object getItem(int arg0) {  
             // TODO Auto-generated method stub  
             return null;  
         }  
    
         @Override 
         public long getItemId(int arg0) {  
             // TODO Auto-generated method stub  
             return 0;  
         }  
    
         @Override 
         public View getView(int position, View convertView, ViewGroup parent) {  
                
             ViewHolder holder = null;  
             if (convertView == null) {  
                    
                 holder=new ViewHolder();    
                    
                 convertView = mInflater.inflate(R.layout.vlist2, null);  
                 holder.img = (ImageView)convertView.findViewById(R.id.img);  
                 holder.title = (TextView)convertView.findViewById(R.id.title);  
                 holder.info = (TextView)convertView.findViewById(R.id.info);  
                 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
                 convertView.setTag(holder);  
                    
             }else {  
                    
                 holder = (ViewHolder)convertView.getTag();  
             }  
                
                
             holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));  
             holder.title.setText((String)mData.get(position).get("title"));  
             holder.info.setText((String)mData.get(position).get("info"));  
                
             holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
                    
                 @Override 
                 public void onClick(View v) {  
                     showInfo();                   
                 }  
             });  
                
                
             return convertView;  
         }  
            
     }  
        
        
        
        
 } 

解决方案 »

  1.   

    holder内加个String message成员初始化  holder.message=new String("whatever");
    调用    showInfo(holder.message);  
    public void showInfo(String msg){ 
             new AlertDialog.Builder(this) 
             .setTitle("我的listview") 
             .setMessage("介绍...:"+msg) 
             .setPositiveButton("确定", new DialogInterface.OnClickListener() { 
                 @Override 
                 public void onClick(DialogInterface dialog, int which) { 
                 } 
             }) 
             .show(); 
         } 
      

  2.   

    Cannot refer to a non-final variable holder inside an inner class defined in a different method
      

  3.   

    public class MyListView4 extends ListActivity {  
        
        
         private List<Map<String, Object>> mData;  
            
         @Override 
         public void onCreate(Bundle savedInstanceState) {  
             super.onCreate(savedInstanceState);  
             mData = getData();  
             MyAdapter adapter = new MyAdapter(this);  
             setListAdapter(adapter);  
         }  
        
         private List<Map<String, Object>> getData() {  
             List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
        
             Map<String, Object> map = new HashMap<String, Object>();  
             map.put("title", "G1");  
             map.put("info", "google 1");  
             map.put("img", R.drawable.i1);  
             list.add(map);  
        
             map = new HashMap<String, Object>();  
             map.put("title", "G2");  
             map.put("info", "google 2");  
             map.put("img", R.drawable.i2);  
             list.add(map);  
        
             map = new HashMap<String, Object>();  
             map.put("title", "G3");  
             map.put("info", "google 3");  
             map.put("img", R.drawable.i3);  
             list.add(map);  
                
             return list;  
         }  
            
         // ListView 中某项被选中后的逻辑  
         @Override 
         protected void onListItemClick(ListView l, View v, int position, long id) {  
                
             Log.v("MyListView4-click", (String)mData.get(position).get("title"));  
         }  
            
         /**  
          * listview中点击按键弹出对话框  
          */ 
         public void showInfo(){  
             new AlertDialog.Builder(this)  
             .setTitle("我的listview")  
             .setMessage("介绍...")  
             .setPositiveButton("确定", new DialogInterface.OnClickListener() {  
                 @Override 
                 public void onClick(DialogInterface dialog, int which) {  
                 }  
             })  
             .show();  
                
         }  
            
            
            
         public final class ViewHolder{  
             public ImageView img;  
             public TextView title;  
             public TextView info;  
             public Button viewBtn;  
         }  
            
            
         public class MyAdapter extends BaseAdapter{  
        
             private LayoutInflater mInflater;  
                
                
             public MyAdapter(Context context){  
                 this.mInflater = LayoutInflater.from(context);  
             }  
             @Override 
             public int getCount() {  
                 // TODO Auto-generated method stub  
                 return mData.size();  
             }  
        
             @Override 
             public Object getItem(int arg0) {  
                 // TODO Auto-generated method stub  
                 return null;  
             }  
        
             @Override 
             public long getItemId(int arg0) {  
                 // TODO Auto-generated method stub  
                 return 0;  
             }  
        
             @Override 
             public View getView(int position, View convertView, ViewGroup parent) {  
                    
                 ViewHolder holder = null;  
                 if (convertView == null) {  
                        
                     holder=new ViewHolder();    
                        
                     convertView = mInflater.inflate(R.layout.vlist2, null);  
                     holder.img = (ImageView)convertView.findViewById(R.id.img);  
                     holder.title = (TextView)convertView.findViewById(R.id.title);  
                     holder.info = (TextView)convertView.findViewById(R.id.info);  
                     holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
                     convertView.setTag(holder);  
                        
                 }else {  
                        
                     holder = (ViewHolder)convertView.getTag();  
                 }  
                    
                    
                 holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));  
                 holder.title.setText((String)mData.get(position).get("title"));  
                 holder.info.setText((String)mData.get(position).get("info"));  
                    
                 holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
                        
                     @Override 
                     public void onClick(View v) {  
                         showInfo();                   
                     }  
                 });  
                    
                    
                 return convertView;  
             }  
                
         }  
            
            
            
            
     } 
      

  4.   

    public View getView(final int position, View convertView, ViewGroup parent) {  
                    
                 ViewHolder holder = null;  
                 if (convertView == null) {  
                        
                     holder=new ViewHolder();    
                        
                     convertView = mInflater.inflate(R.layout.vlist2, null);  
                     holder.img = (ImageView)convertView.findViewById(R.id.img);  
                     holder.title = (TextView)convertView.findViewById(R.id.title);  
                     holder.info = (TextView)convertView.findViewById(R.id.info);  
                     holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
                     convertView.setTag(holder);  
                        
                 }else {  
                        
                     holder = (ViewHolder)convertView.getTag();  
                 }  
                    
                    
                 holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));  
                 holder.title.setText((String)mData.get(position).get("title"));  
                 holder.info.setText((String)mData.get(position).get("info"));  
                    
                 holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
                        
                     @Override 
                     public void onClick(View v) {  
                         showInfo(); //在这里将position传递给showInfo;即showInfo(position);                  
                     }  
                 });  
                    
                    
                 return convertView;  
             }  public void showInfo(int position){  //在这个中根据position,即点击的ListView的哪一项,处理相应的信息即可
             new AlertDialog.Builder(this)  
             .setTitle("我的listview")  
             .setMessage("介绍...")  
             .setPositiveButton("确定", new DialogInterface.OnClickListener() {  
                 @Override 
                 public void onClick(DialogInterface dialog, int which) {  
                 }  
             })  
             .show();  
                
         }  
            
      

  5.   


    public final class ViewHolder{  
             public ImageView img;  
             public TextView title;  
             public TextView info;  
             public Button viewBtn; 
             public String  msg;   //定义每个Item显示的信息
         }  showInfo给个信息的参数就可以了
    public void showInfo(String msg);
      

  6.   

    Cannot refer to a non-final variable position inside an inner class defined in a different method
    出现这个错误~
      

  7.   


    非final变量 不能在内部类直接使用
    在MyAdapter声明一个pos变量,内部类使用时先在外面初始化pos变量
    内部类使用MyAdapter.this.pos来调用
      

  8.   

    你还可以
    public class MyClickListener implements View.OnClickListener{ private int position ;

    public MyClickListener(int position){
    this.position = position;
    }
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    showInfo(position);
    }

    }
    }
    自己写个监听器就好了~