您的位置:首页 > 移动开发 > Android开发

Android中ListView复用导致其他Item显示异常

2015-09-07 16:39 706 查看
基于上一个博客内容在在有大量Item的情况下,

Android会对ListView中的Item进行复用,

就会导致触发上面一个Item中的按钮后导致下面的按钮也跟着变

红色边框代表手机屏幕

Item1、Item2、Item3是在屏幕上显示

Item4、Item5需要滑动才可见



点击Item1后滑动屏幕后发现Item4也被触发了

不想出现这种情况需要对被点击的项进行一些处理

//定义一个列表用于保存选中项目
CustomSimpleAdapter adapter_your = new CustomSimpleAdapter(RecommendActivity.this, getData(), R.layout.list_recommendyour_item,
new String[]{"MyID", "MusicName"},
new int[]{R.id.txt_myID, R.id.txt_music_title, R.id.txt_singer);


自定义一个Adapter

/*
* 自定义Adapter、继承SimpleAdapter
* 用于解决按钮被复用的问题
*/
private class CustomSimpleAdapter extends SimpleAdapter {
//定义一个列表用于保存选中项目
private List<Integer> mSelect = new ArrayList<Integer>();

public CustomSimpleAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
// TODO Auto-generated constructor stub
}
//重点是这里,需要重写getView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final int mPosition = position;
//获取当前的View
convertView = super.getView(position, convertView, parent);
//取出按钮或是CheckBox
ImageButton btn_more = (ImageButton) convertView.findViewById(R.id.btn_more);
btn_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//此处记录下当前操作的mPosition
mSelect.add(new Integer(mPosition));
//下面是你对应的页面效果处理,比如显示、隐藏
int visiblePosition = list_your.getFirstVisiblePosition();
View currentView = list_your.getChildAt(mPosition - visiblePosition);
currentView.findViewById(R.id.control2).setVisibility(View.VISIBLE);
currentView.findViewById(R.id.control1).setVisibility(View.GONE);
}
});

ImageButton btn_back = (ImageButton) convertView
.findViewById(R.id.btn_back);
btn_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//此处删除当前操作的mPosition
mSelect.remove(new Integer(mPosition));
//下面是你对应的页面效果处理,比如显示、隐藏
int visiblePosition = list_your.getFirstVisiblePosition();
View currentView = list_your.getChildAt(mPosition - visiblePosition);
currentView.findViewById(R.id.control1).setVisibility(View.VISIBLE);
currentView.findViewById(R.id.control2).setVisibility(View.GONE);
}
});

//在结尾的时候重记录的列表中对页面效果进行处理
if (mSelect.indexOf(mPosition) > -1) {
convertView.findViewById(R.id.control2).setVisibility(View.VISIBLE);
convertView.findViewById(R.id.control1).setVisibility(View.GONE);
}else{
convertView.findViewById(R.id.control1).setVisibility(View.VISIBLE);
convertView.findViewById(R.id.control2).setVisibility(View.GONE);
}

return convertView;
}
}


数据绑定可以参考上一篇文章

Android中ListView数据绑定和获取内部控件

http://blog.csdn.net/q12076235/article/details/48264277
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview 手机