1.当ListView中有Button的时候往往会遇到很多问题,比较常见的一个问题是:
假设:在ListView中有N个Item当点击其中某个Item中的Button的时候,需要改变当前Button的状态,在你点击以后确实最后一个Item的Button的状态改变了,不管点击哪一个Button都是最后一个
Item的中的Button的状态被改变了,这里涉及到ListView重绘的问题。
要解决上面的问题的方法是将点击的监听事件提出来进行封装,在用就可以解决上述问题了。
给个示例代码:
在ListView的自定义Adapter的getView方法中:
MianActivity自定义Adapter中
1 @Override 2 public View getView(int position, View convertView, ViewGroup parent) { 3 4 System.out.println("getViewgetViewgetViewgetViewgetView"); 5 if (convertView == null) { 6 viewHolder = new ViewHolder(); 7 convertView = LayoutInflater.from(context).inflate( 8 R.layout.item, null); 9 viewHolder.left = (Button) convertView 10 .findViewById(R.id.btn_left); 11 viewHolder.right = (Button) convertView 12 .findViewById(R.id.btn_right); 13 mOnClickListener = MyOnClickListener.instance(); 14 mOnClickListener.setContext(MainActivity.this); 15 viewHolder.left.setOnClickListener(mOnClickListener); 16 convertView.setTag(viewHolder); 17 } else { 18 viewHolder = (ViewHolder) convertView.getTag(); 19 } 20 21 return convertView; 22 }
viewHolder.left这个Button的点击事件封装一下就可以消除上述问题了
MyOnClickListenter:
1 public class MyOnClickListener implements OnClickListener { 2 3 private static MyOnClickListener mOnClickListener; 4 5 private Button btn; 6 7 private Context context; 8 9 public static MyOnClickListener instance() { 10 if (mOnClickListener == null) { 11 mOnClickListener = new MyOnClickListener(); 12 } 13 14 return mOnClickListener; 15 } 16 17 public void setContext(Context context) { 18 this.context = context; 19 20 } 21 22 @Override 23 public void onClick(View v) { 24 btn = (Button) v; 25 final EditText edtextView = new EditText(context); 26 new AlertDialog.Builder(context).setTitle("请输入密码").setView(edtextView) 27 .setPositiveButton("确定", new AlertDialog.OnClickListener() { 28 29 @Override 30 public void onClick(DialogInterface dialog, int which) { 31 System.out 32 .println("setPositiveButtonsetPositiveButtonsetPositiveButton"); 33 String passwaord = edtextView.getText().toString() 34 .trim(); 35 System.out.println("获取到的密码是多少-->>" + passwaord); 36 if (passwaord.equals("123")) { 37 System.out 38 .println("执行了123132123132123132132131313"); 39 btn.setText("关闭中"); 40 btn.setBackgroundResource(R.drawable.toggle_bg_on); 41 } 42 43 } 44 }).create().show(); 45 46 } 47 48 }