如何在滑动时改变RecyclerView项目的颜色?

6

我正在尝试在滑动时更改recyclerView项的颜色,使其高亮,因为在滑动时我会打开一个AlertDialog,这样人们就可以识别他要更改哪个项目。

但我的主要问题是,当我尝试使用以下代码更改背景颜色时:

viewHolder.itemView.setBackgroundColor(Color.parseColor("#cc0000"));

什么也没有发生,这是我从recyclerView构建器中提取的完整代码。

public void buildTopRecyclerView(){

    mRecyclerViewTOP = findViewById(R.id.listView);
    mRecyclerViewTOP.setHasFixedSize(true);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
    exampleAdapter = new ExampleAdapter(itemCassas);
    mRecyclerViewTOP.setLayoutManager(mLayoutManager);
    mRecyclerViewTOP.setAdapter(exampleAdapter);

  //  onSwipe();

    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            int position = viewHolder.getAdapterPosition();
            if (direction == ItemTouchHelper.RIGHT) {
                customAllertDelete(position);
                viewHolder.itemView.setBackgroundColor(Color.parseColor("#cc0000"));
                exampleAdapter.notifyDataSetChanged();
            }
            if (direction == ItemTouchHelper.LEFT) {
                customAllertQuantity(position);
            }

        }
    }).attachToRecyclerView(mRecyclerViewTOP);

}

如果有用的话,这里也是适配器代码

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {

    private ArrayList<ItemCassa> mExampleList;


    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerlist_item,parent,false);
        return new ExampleViewHolder(v);
    }

    ExampleAdapter(ArrayList<ItemCassa> exampleList){
        mExampleList = exampleList;
    }

    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
        ItemCassa item = mExampleList.get(position);

        holder.desc.setText(item.getBtnName());
        holder.qta.setText(String.valueOf(item.getQuant()));
        holder.imp.setText(String.valueOf((new DecimalFormat("#0.00").format(item.getPrice()))));

        if(position % 2 == 0 ){
            holder.itemView.setBackgroundColor(Color.parseColor("#C0C0C0"));
            holder.desc.setBackgroundColor(Color.parseColor("#C0C0C0"));
            holder.qta.setBackgroundColor(Color.parseColor("#C0C0C0"));
            holder.imp.setBackgroundColor(Color.parseColor("#C0C0C0"));

        }else if(position % 2 == 1){
            holder.itemView.setBackgroundColor(Color.parseColor("#D3D3D3"));
            holder.desc.setBackgroundColor(Color.parseColor("#D3D3D3"));
            holder.qta.setBackgroundColor(Color.parseColor("#D3D3D3"));
            holder.imp.setBackgroundColor(Color.parseColor("#D3D3D3"));

        }

    }

    @Override
    public int getItemCount() {
       return mExampleList.size();
    }

    public static class ExampleViewHolder extends RecyclerView.ViewHolder {

        public TextView desc;
        public TextView qta;
        public TextView imp;

        ExampleViewHolder(View itemView) {
            super(itemView);

            desc = itemView.findViewById(R.id.Desc);
            qta = itemView.findViewById(R.id.Qta);
            imp = itemView.findViewById(R.id.Imp);


        }
    }

    public void removeItem(int position) {
        mExampleList.remove(position);
        notifyItemRemoved(position);
    }




}

这是一个GIF,稍微“解释”了一下我的意图。如您所见,在滑动时会打开AlertDialog并返回所选项目,但现在我想将所选项目的背景颜色设为彩色,直到用户在AlertDialog中作出选择。

IMAGE


好的。我认为你没有获取项目位置。如果您直接从适配器中获取位置会更好。 - Umair
@Umair 实际上,我能够从alertDialog中删除onSwipe位置的项目,因此我正在获取位置。 - NiceToMytyuk
1
通过查看您的代码,您正在尝试通过警告对话框删除一个项目,并在删除后将该项目的背景颜色更改为红色背景。我说得对吗? - Umair
1
另一种方法是在滑动项目时,在其上绘制动画。这样做的效果是将滑动项目的空白区域着色为红色,以便用户知道正在滑动该特定项目。 - Umair
1
好的,我明白了,让我为您发布一个答案。 - Umair
显示剩余7条评论
1个回答

1

请尝试以下方式使用:

首先,在您的onSwiped方法中调用适配器的方法并传递所需参数。

  @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            int swipedPosition = viewHolder.getAdapterPosition();
            YourAdapter adapter = (YourAdapter) rlCartList.getAdapter();


                adapter.remove(swipedPosition); // I was removing items so you
                                                  can change the name of method as you like
        }

现在在您的适配器中,可以这样做:
  public void remove(int position) {

        YourModel item = cartItems.get(position);

        if (cartItems.contains(item)) {
            ViewHolder.tvItemName.setBackgroundColor(mContext.getResources().getColor(R.color.grey));
            notifyDataSetChanged();
        }
    }

还有一件事是,您需要将textView或您分配背景的视图设置为静态。 我已经测试过这段代码,它在我的项目中运行良好,textView的背景在滑动时会改变。

如果您需要进一步帮助,请告诉我。 还有一件事,您也可以在适配器中使用警报对话框 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接