简体   繁体   English

RecyclerView中的单选选项

[英]single choice selection in RecyclerView

I am trying to get if a row is clicked background color of row changes to blue and previous selected row background color changes to transparent how can I achieve this 我试图得到如果一行被点击的背景颜色的行变为蓝色和之前选择的行背景颜色变为透明我怎么能实现这一点

this is my adapter for recycler view 这是我的回收器视图适配器

package kva.recyclerview;

import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;


public class adapter extends RecyclerView.Adapter<adapter.MyViewHolder> {

    Context context;
    LayoutInflater inflater;
    ArrayList<String> arrayList;
    public adapter(Context context, ArrayList<String> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = inflater.inflate(R.layout.lit_item, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        holder.tvphone.setText(arrayList.get(position));
        holder.tvemail.setText(arrayList.get(position));
        holder.tvname.setText(arrayList.get(position));
      }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tvname;
        TextView tvemail;
        TextView tvphone;

        public MyViewHolder(View itemView) {
            super(itemView);
            tvemail = (TextView) itemView.findViewById(R.id.emailtv);
            tvname = (TextView) itemView.findViewById(R.id.nametv);
            tvphone = (TextView) itemView.findViewById(R.id.phonetv);

        }
    }
}

My mainactivity 我的主动

public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
    adapter adapter;
    View oldView=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayList<String> arrayList=new ArrayList<String>();
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");
       arrayList.add("aa");

        recyclerView=(RecyclerView)findViewById(R.id.recView);
        adapter=new adapter(this,arrayList);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
        recyclerView.addOnItemTouchListener(
                new RecyclerItemClickListener(this, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
                    @Override public void onItemClick(View view, int position) {

                          view.setBackgroundColor(Color.BLUE);

                      }

                    @Override public void onLongItemClick(View view, int position) {
                        // do whatever
                    }
                })
        );
    }
}

It is always better to use a mode class to represent data to be loaded into the recycler view. 最好使用模式类来表示要加载到回收器视图中的数据。 Example, 例,

      public class DataModel {
private String name;

private int type;


public DataModel(String name, int type) {
    this.name = name;
    this.type = type;
}

public int getType() {
    return type;
}

public void setType(int type) {
    this.type = type;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

} }

Use such model class to load data. 使用此类模型类来加载数据。 In you bindViewHolder you can make a checking say, 你在bindViewHolder中可以做一个检查说,

      if (arrayList.get(position).getType() == 1)
        holder.tv_simple_name.setTextColor(mContext.getResources().getColor(R.color.black));
    else if (arrayList.get(position).getType() == 2)
        holder.tv_simple_name.setTextColor(mContext.getResources().getColor(R.color.blue));
    else if (arrayList.get(position).getType() == 3)
        holder.tv_simple_name.setTextColor(mContext.getResources().getColor(R.color.transparent));

Add this line to your recyclerview item onClick 将此行添加到您的recyclerview项目onClick

      for (int i = 0; i < arrayList.size(); i++) {
                if (arrayList.get(i).getType() == 2)
                    arrayList.get(i).setType(3);
                else if (itemsList.get(i).getType() == 3)
                    arrayList.get(i).setType(1);
            }
            arrayList.get(position).setType(2);
            notifyDataSetChanged();

While adding items to model class, set initial value of type as 1 for all items 在向模型类添加项目时,将所有项目的类型初始值设置为1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM