更改recyclelerView项目背景onClick?

时间:2018-06-15 12:36:16

标签: android android-recyclerview

当我按下recyclerView中的一个按钮时,我会改变它的背景颜色,这样就可以看到被按下但是我不是很熟悉,所以我不能得到怎么做。

我尝试过在网上找到的一些指南,但大多数都没有为我工作,就像在这个guide按钮没有得到它们的颜色而只是白色。 我会这样想 screen of my activity

这是我的recyclerView适配器代码:

public class RecyclerViewMenu extends RecyclerView.Adapter<RecyclerViewMenu.MenuViewHolder> {

private ArrayList<MenuConstructor> menuConstructors;
private OnItemClickListener onItemClickListener;

public interface  OnItemClickListener {
    void onItemClick(int position);
}

public void setOnItemClickListener(OnItemClickListener listener){
    onItemClickListener = listener;
}

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

}


RecyclerViewMenu(ArrayList<MenuConstructor> menuList){
    menuConstructors = menuList;
}

@Override
public void onBindViewHolder(@NonNull final MenuViewHolder holder, final int position) {


    MenuConstructor currentItem = menuConstructors.get(position);

    holder.textView.setText(currentItem.getDesk());
    holder.itemView.setBackgroundColor(Color.parseColor(currentItem.getSfondoColor()));
    holder.textView.setTextColor(Color.parseColor(currentItem.getFontColor()));



}

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

public static class MenuViewHolder extends RecyclerView.ViewHolder {

    public TextView textView;

    MenuViewHolder(View itemView, final OnItemClickListener listener) {
        super(itemView);

        textView = itemView.findViewById(R.id.ButtonName);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION){
                            listener.onItemClick(position);
                        }
                    }


            }
        });



    }
}

}

实际上,如果我按下按钮,它就会加载RecyclerView个不同的项目,例如“CICCIO&#34;&#34; CICCIO&#34;按下上方会加载一些东西,如果按下另一个按钮,它会加载其他项目,如果我使用快速学习答案,那么会发生什么

Gif of activity that change items by pressing buttons

Here after using quick learner solution it's change color but not anymore the items

3 个答案:

答案 0 :(得分:3)

要更改 RecyclerView 中被点击项目的背景,您需要使用 iterface 捕捉适配器中的点击:

interface ItemClickListener {
    fun onItemClickListener(item: Item, position: Int)
}

当我们点击时,我们将获得项目和项目位置。在适配器中的绑定函数中,我们将在您的按钮上设置点击监听器:

yourButton.setOnClickListener {
    onClickListener.onItemClickListener(item, position)
}

在您的活动中,您将实现此接口:

class MainActivity : AppCompatActivity(), ItemAdapter.ItemClickListener {

接下来我们需要实现项目点击的背景变化逻辑。逻辑是这样的:当用户点击一个项目时,我们检查被点击项目的背景是否为白色(该项目之前没有被点击),如果这个条件为真,我们将改变该项目中所有项目的背景RecyclerView 为白色(如果有的话,使之前点击和标记的项目无效),然后将点击项目的背景颜色更改为青色以标记它。如果被点击的项目的背景是蓝绿色(这意味着用户再次点击之前标记的同一个项目),我们将所有项目的背景颜色更改为白色。首先,我们需要将我们的项目背景颜色作为 ColorDrawable。我们将使用迭代器函数遍历 RecyclerView 的所有项(子项),并使用 forEach() 函数更改每个项的背景。这个方法看起来像这样:

 override fun onItemClickListener(item: Item, position: Int) {
        val itemBackground: ColorDrawable =
            binding.recycler[position].background as ColorDrawable
        if (itemBackground.color == ContextCompat.getColor(this, R.color.white)) {
            binding.recycler.children.iterator().forEach { item ->
                item.setBackgroundColor(
                    ContextCompat.getColor(
                        this,
                        R.color.white
                    )
                )
            }
            binding.recycler[position].setBackgroundColor(
                ContextCompat.getColor(this, R.color.teal_200)
            )
        } else {
            binding.recycler.children.iterator().forEach { item ->
                item.setBackgroundColor(
                    ContextCompat.getColor(
                        this,
                        R.color.white
                    )
                )
            }
        }
    }

所以现在你改变了项目点击的背景,如果你点击同一个项目,你会把背景改回以前的样子。

答案 1 :(得分:0)

做一件事。将颜色资源ID放在MenuConstructor这个类中。并在onBind中将此类中的颜色设置为itemView。无论何时单击按钮,都可以在MenuConstructor中更改此类在特定位置上的颜色。

在MenuConstructor这个类中更改颜色后,Just notifyDataSetChanged()调用此方法。

在onBind上,

holder.textView.setTag(position);
holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = (Integer) v.getTag();
//change color in this
notifiDataSetChanged();
}
        });

答案 2 :(得分:0)

如果要在回收站视图中更改所选项目的颜色,请尝试此操作

 public class AdapterClass extends RecyclerView.Adapter<AdapterClass.ViewHolder> {
            private int selected_position = -1;

            @Override
            public void onBindViewHolder(PlacesLocationAdapter.ViewHolder holder, final int position) {
                if (selected_position == position) {
                    // do your stuff here like
                    //Change selected item background color 

                } else {
                      // do your stuff here like
                      //Change  unselected item background color 
                }
              // rest of the code here

       }


    }

这个MenuViewHolder类应该是这样的

public static class MenuViewHolder extends RecyclerView.ViewHolder {

    public TextView textView;

    MenuViewHolder(View itemView, final OnItemClickListener listener) {
        super(itemView);

        textView = itemView.findViewById(R.id.ButtonName);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION){
                            listener.onItemClick(position);
                         selected_position = position;
                         notifyDataSetChanged();
                        }
                    }


            }
        });



    }