android ListView中的Item有Button时候点击异常处理

时间:2024-01-01 10:16:09

1.当ListView中有Button的时候往往会遇到很多问题,比较常见的一个问题是:

  假设:在ListView中有N个Item当点击其中某个Item中的Button的时候,需要改变当前Button的状态,在你点击以后确实最后一个Item的Button的状态改变了,不管点击哪一个Button都是最后一个

 Item的中的Button的状态被改变了,这里涉及到ListView重绘的问题。

  要解决上面的问题的方法是将点击的监听事件提出来进行封装,在用就可以解决上述问题了。

给个示例代码:

在ListView的自定义Adapter的getView方法中:

aaarticlea/png;base64,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" alt="" />

MianActivity自定义Adapter中

 @Override
public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getViewgetViewgetViewgetViewgetView");
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.item, null);
viewHolder.left = (Button) convertView
.findViewById(R.id.btn_left);
viewHolder.right = (Button) convertView
.findViewById(R.id.btn_right);
mOnClickListener = MyOnClickListener.instance();
mOnClickListener.setContext(MainActivity.this);
viewHolder.left.setOnClickListener(mOnClickListener);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
} return convertView;
}

viewHolder.left这个Button的点击事件封装一下就可以消除上述问题了

MyOnClickListenter:

 public class MyOnClickListener implements OnClickListener {

     private static MyOnClickListener mOnClickListener;

     private Button btn;

     private Context context;

     public static MyOnClickListener instance() {
if (mOnClickListener == null) {
mOnClickListener = new MyOnClickListener();
} return mOnClickListener;
} public void setContext(Context context) {
this.context = context; } @Override
public void onClick(View v) {
btn = (Button) v;
final EditText edtextView = new EditText(context);
new AlertDialog.Builder(context).setTitle("请输入密码").setView(edtextView)
.setPositiveButton("确定", new AlertDialog.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
System.out
.println("setPositiveButtonsetPositiveButtonsetPositiveButton");
String passwaord = edtextView.getText().toString()
.trim();
System.out.println("获取到的密码是多少-->>" + passwaord);
if (passwaord.equals("123")) {
System.out
.println("执行了123132123132123132132131313");
btn.setText("关闭中");
btn.setBackgroundResource(R.drawable.toggle_bg_on);
} }
}).create().show(); } }

示例代码下载