迭代RecyclerView中的所有项目

时间:2018-08-02 21:44:39

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

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

我觉得最好的方法是for循环,但是我似乎找不到for循环。我也尝试过使用notifyDataSetChanged()重置所有CardView,但是那也不起作用。

这是我的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循环。

4 个答案:

答案 0 :(得分:4)

通常,您应该以这样的方式编写适配器: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
    }

    ...
}    

您可以通过仅通知适配器旧的点击位置和新的点击位置已更改(以便您不必重新绑定每个视图)来改善此情况,但是为了简单起见,我将其保留了下来就这样。

答案 1 :(得分:0)

  1. 您应该在模型中有一个final File file = File('${_localPath}output.pdf'); try { http.Response response = await http.get( '$pdfUrl?property_id=153', headers: { 'Content-Type': 'application/json', }, ); await file.writeAsBytes(response.bodyBytes); } catch (e) { print(e); } 之类的字段,对于所有列表项,都将其设置为false。

  2. 将其传递给适配器。

  3. 在适配器中检查isSelected中的条件:

    onBindViewHolder

  4. 无论何时单击项目更改,都只需反转字段项目,即,将其设为false则为true或为true时为false。

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

答案 2 :(得分:0)

for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
  ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
}

答案 3 :(得分:0)

   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);
   }