【问题标题】:Iterate All Items In RecyclerView迭代 RecyclerView 中的所有项目
【发布时间】:2019-01-10 18:04:34
【问题描述】:

我有一个 CardViews 的 RecyclerView。我试图让它在您单击其中一个 CardView 的位置,它会更改该 CardView 的背景。这部分有效。我被卡住的地方是试图将所有其他 CardViews 改回白色,这样看起来就不会选择多个。

我觉得最好的方法是使用 for 循环,但我似乎找不到 for 循环应该是什么。我还尝试使用notifyDataSetChanged() 重置所有 CardViews,但这也不起作用。

这是我的onItemClicked() 函数(可以正常工作):

mAdapter = new TransferCard(list, getContext(), new TransferCard.OnItemClickListener() {
    @Override 
    public void onItemClick(View v, int position) {
        //What code goes here to change all Views in the RecyclerView to have a background of white
        RelativeLayout temp = v.findViewById(R.id.cardForeground);
        item = list.get(position);
        temp.setBackgroundColor(getResources().getColor(R.color.selected));
    }
});

这是我的onCreateViewHolder()setOnTouchListener() 事件所在的位置。

@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.transfer_card, parent, false);
    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            listener.onItemClick(v, parent.indexOfChild(v));
        }
    });
    return new MyViewHolder(itemView);
}

看来我就差不多了,但我需要知道如何处理 for 循环。

【问题讨论】:

    标签: android android-studio for-loop android-recyclerview


    【解决方案1】:
    for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
      ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
    }
    

    【讨论】:

    • 感谢@Snort 它对我有用
    【解决方案2】:

    通常,您应该以onBindViewHolder() 是您修改视图的唯一位置的方式编写适配器。对于您要执行的操作,我认为最简单的方法是跟踪被点击的最后一个位置,然后让onBindViewHolder() 根据其位置是否等于最后一个位置将背景设置为黑色或白色点按位置。

    @Override 
    public void onItemClick(View v, int position) {
        lastTappedPosition = position;
        mAdapter.notifyDataSetChanged();
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if (position == lastTappedPosition) {
            // set color selected
        } else {
            // set color unselected
        }
    
        ...
    }    
    

    您可以通过仅通知适配器旧的分接位置和新的分接位置已更改来改进这一点(这样您就不必重新绑定每个视图),但为了简单起见,我保留了它原样。

    【讨论】:

    • 我的问题是onBindViewHolder() 在一个班级,而onItemClick() 在另一个班级。我该如何解决?
    • 我让它工作了,但由于某种原因它不能在最后一个工作。
    • 如果你点击最后一个,它会改变第二个到最后一个的颜色
    • 开个玩笑,它只适用于前两个。我只有三个,所以我添加了更多,它只适用于 1 和 2。
    • 如果我将位置打印到控制台,第一个打印 0,第二个打印 1。
    【解决方案3】:
    1. 您的模型中应该有一个类似 isSelected 的字段,将所有列表项都设为 false。

    2. 将其传递给您的适配器。

    3. onBindViewHolder中你的适配器检查条件:

      if (list.get(i).isSelected) { // change background to black } else { // change background to white
      }

    4. 当你点击一个项目时,只需反转字段项目,即如果它是假的就让它为真,如果它是真的就让它为假。

      list.get(i),isSelected = !list.get(i).isSelected;

    【讨论】:

      【解决方案4】:
         for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
             RecyclerView.ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
             TextView txtAbc0       = holder.itemView.findViewById(R.id.txt_abc0);
             TextView txtAbc1       = holder.itemView.findViewById(R.id.txt_abc1);
             txtAbc0.setText("abc0="+i);
             txtAbc1.setText("abc1="+i);
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 2014-02-13
        • 2021-09-09
        相关资源
        最近更新 更多