【发布时间】:2014-08-17 11:22:21
【问题描述】:
在我的列表视图中实现“标记为收藏”功能时遇到问题。我在每个列表视图项的右侧放置了一个 ImageButton,并且“单击”我想更改按钮的图像。它应该是这样的:
这很容易实现并且运行良好。现在的问题是当我滚动列表时,选定的图像按钮(星号)不会保持不变。
保持列表视图项的选择并不难,但保持更改后的图像在列表中对我来说是个问题。 前者可以这样实现: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() 中获得的位置并不总是相同,并且取决于列表滚动到的位置?
所以为了缩短我的问题:即使滚动,我如何才能将我的 ImageButtons 的选择/图像保留在 ListView 中?
【问题讨论】:
-
查看ViewHolder 模式。 :)
-
@EranGoldin 谢谢,但我使用了 ViewHolder 模式。我可能剪掉了太多代码,因为我想保持清晰,但我现在编辑了我的帖子,所以你可以看到我使用了这个模式。
标签: android listview scroll selection