我在实施"标记为收藏时遇到问题"功能在我的列表视图中。我有一个ImageButton放在每个listview项的右侧,"点击"我想改变按钮的图像。它应该是这样的:
这很容易实现,并且工作得非常好。现在的问题是当我滚动列表时,所选图像按钮(星星)不会保持不变。
要保持列表视图项目的选择并不困难,但要将更改后的图像保留在列表中对我来说是一个问题。 前者可以通过这种方式实现:https://stackoverflow.com/a/9281155/2054118
所以我尝试了类似的东西。在getView()方法中,我初始化我的imagebutton及其OnClickListener,以保存LinkedList中的实际位置。所选ImageButtons的所有位置都应在列表中:
MyAdapter.java:
private LinkedList<Integer> selectedIndeces;
...
private static class ViewHolder {
...
public ImageButton favoriteButton;
}
public void changeSelectedPositions(int pos) {
int index = this.selectedIndeces.indexOf(pos);
if (index != -1) {
// image button in this row was selected
this.selectedIndeces.remove(index);
} else {
// mark position of the image button as selected
this.selectedIndeces.add(pos);
}
notifyDataSetChanged();
}
...
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse views
if (rowView == null) {
rowView = this.mInflater.inflate(R.layout.talk_list_child, null);
// configure view holder
ViewHolder viewHolder = new ViewHolder();
...
ImageButton ib = (ImageButton) rowView.findViewById(R.id.ib_favorite);
ib.setFocusable(false);
ib.setFocusableInTouchMode(false);
ib.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
// Set the button's appearance
button.setSelected(!button.isSelected());
changeSelectedPositions(position);
}
});
viewHolder.favoriteButton = ib;
}
// fill data
ViewHolder holder = (ViewHolder) rowView.getTag();
...
if (selectedIndeces.contains(position)) {
holder.favoriteButton.setImageResource(R.drawable.fav_selected);
} else {
holder.favoriteButton.setImageResource(R.drawable.fav_unselected);
}
}
但问题是我在getView()中得到的位置是否总是相同的,取决于列表滚动到哪里?
所以要缩短我的问题:即使我滚动,如何在ListView中保留我的ImageButtons的选择/图像?
答案 0 :(得分:1)
您在准备viewHolder
时保存了自己的位置。滚动后,视图将被回收,并使用与先前存储位置相同的viewHolder
。您每次收到getView()
电话时都可以设置听众。
移动
ib.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
// Set the button's appearance
button.setSelected(!button.isSelected());
changeSelectedPositions(position);
}
});
就在
之前if (selectedIndeces.contains(position)) {
答案 1 :(得分:1)
保留数组列表以保存在适配器中单击的位置
iconClickedPostion = new ArrayList();
每当您处理列表中图像按钮的单击时,请在arraylist中添加listview的位置。
iconClickedPostion.add(位置);
在getView()中,检查条件是否已被点击,然后设置所需的图像。
如果(iconClickedPostion.contains(位置)){ completedIcon.setImageResource(R.drawable.ic_done); } 其他{ completedIcon.setImageResource(iconId [位置]); }