滚动列表视图时查看可见性问题
View Visiblity issue while scrolling of Listview
我有一个带有 textview 和 imageview 以及 imageview 的自定义列表视图,如复选标记。在选择textView时,在listView的OnItemClickListener上,我将使ImageView可见可见以显示已选择的。
stickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
stickyList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String tag = (String) ((TextView) view
.findViewById(R.id.tvtag)).getText();
ImageView cb = (ImageView)
view.findViewById(R.id.ic_check);
if (cb.getVisibility() == View.VISIBLE) {
cb.setVisibility(
View.GONE);
selectedtags.remove(tag);
} else {
cb.setVisibility(
View.VISIBLE);
selectedtags.add(tag);
}
}
});
它工作正常,直到列表视图向下滚动。如果我选择了 listview 的前两个位置 textview,当我向下滚动 listview 时,imageview(cb) 的可见性对于前两个可见 postions.It 意味着 imageview 在向下滚动后的相同位置变得可见。
获取视图方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.recenttag_list_item,
parent, false);
holder.text = (TextView) convertView.findViewById(R.id.tvtag);
holder.checkmark = (ImageView) convertView
.findViewById(R.id.ic_check);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(data.get(position).mytag);
return convertView;
}
您看到的原因是列表项视图被回收(这就是 convertView
的用途)。当您滚动 ListView
时,上一个滚动出屏幕的项目将作为下一个位置的 convertView
传递回您的适配器。
您需要确保在每次调用 getView()
时完全重置项目视图的状态,这样这样的更改不会从视图项目的一次使用泄漏到下一次。这可能意味着您必须始终检查 getView()
中该位置的当前 "checked" 值以确定它是否应该可见。
编辑:也许这会有所帮助...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
/* Unchanged code omitted */
holder.text.setText(data.get(position).mytag);
boolean checkVisible = ???; //Use whatever logic your app has to determine if this position should be checked
holder.checkmark.setVisibility(checkVisible); //Always set the visibility to what it should be for this position
return convertView;
}
我有一个带有 textview 和 imageview 以及 imageview 的自定义列表视图,如复选标记。在选择textView时,在listView的OnItemClickListener上,我将使ImageView可见可见以显示已选择的。
stickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
stickyList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
String tag = (String) ((TextView) view
.findViewById(R.id.tvtag)).getText();
ImageView cb = (ImageView)
view.findViewById(R.id.ic_check);
if (cb.getVisibility() == View.VISIBLE) {
cb.setVisibility(
View.GONE);
selectedtags.remove(tag);
} else {
cb.setVisibility(
View.VISIBLE);
selectedtags.add(tag);
}
}
});
它工作正常,直到列表视图向下滚动。如果我选择了 listview 的前两个位置 textview,当我向下滚动 listview 时,imageview(cb) 的可见性对于前两个可见 postions.It 意味着 imageview 在向下滚动后的相同位置变得可见。
获取视图方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.recenttag_list_item,
parent, false);
holder.text = (TextView) convertView.findViewById(R.id.tvtag);
holder.checkmark = (ImageView) convertView
.findViewById(R.id.ic_check);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(data.get(position).mytag);
return convertView;
}
您看到的原因是列表项视图被回收(这就是 convertView
的用途)。当您滚动 ListView
时,上一个滚动出屏幕的项目将作为下一个位置的 convertView
传递回您的适配器。
您需要确保在每次调用 getView()
时完全重置项目视图的状态,这样这样的更改不会从视图项目的一次使用泄漏到下一次。这可能意味着您必须始终检查 getView()
中该位置的当前 "checked" 值以确定它是否应该可见。
编辑:也许这会有所帮助...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
/* Unchanged code omitted */
holder.text.setText(data.get(position).mytag);
boolean checkVisible = ???; //Use whatever logic your app has to determine if this position should be checked
holder.checkmark.setVisibility(checkVisible); //Always set the visibility to what it should be for this position
return convertView;
}