在ListView中滚动时保留图像按钮的图像

时间:2014-08-17 11:22:21

标签: android listview scroll selection

我在实施"标记为收藏时遇到问题"功能在我的列表视图中。我有一个ImageButton放在每个listview项的右侧,"点击"我想改变按钮的图像。它应该是这样的:

enter image description here

这很容易实现,并且工作得非常好。现在的问题是当我滚动列表时,所选图像按钮(星星)不会保持不变。

要保持列表视图项目的选择并不困难,但要将更改后的图像保留在列表中对我来说是一个问题。 前者可以通过这种方式实现: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的选择/图像?

2 个答案:

答案 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)

  1. 保留数组列表以保存在适配器中单击的位置

    iconClickedPostion = new ArrayList();

  2. 每当您处理列表中图像按钮的单击时,请在arraylist中添加listview的位置。

    iconClickedPostion.add(位置);

  3. 在getView()中,检查条件是否已被点击,然后设置所需的图像。

    如果(iconClickedPostion.contains(位置)){ completedIcon.setImageResource(R.drawable.ic_done); } 其他{ completedIcon.setImageResource(iconId [位置]); }