【问题标题】:Keep Image of Image Button when scrolling in ListView在 ListView 中滚动时保留图像按钮的图像
【发布时间】: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


【解决方案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)) {

【讨论】:

  • 感谢您的回答,效果很好。 :) 现在回想起来,这很明显,但我找不到我的错误...
【解决方案2】:
  1. 保留一个数组列表以保存在您的适配器中单击的位置

    iconClickedPostion = new ArrayList();

  2. 每当您处理单击列表中的图像按钮时,将列表视图的位置添加到数组列表中。

    iconClickedPostion.add(位置);

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

    if(iconClickedPostion.contains(位置)){ 完成图标.setImageResource(R.drawable.ic_done); } 别的 { 完成图标.setImageResource(iconId[位置]); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多