单击后textview背景不会改变

时间:2016-01-27 12:45:40

标签: android android-recyclerview

我编写了一个关于在单击文本后更改TextView背景的代码,但背景颜色没有改变,但其他TextView背景颜色发生了变化。我知道recyclerview是重用视图,因此我设置notifyItemchanged()以避免重置视图。

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

    private List<String> innertext;
    private Context mContext;

    public MyAdapter(List<String> items,Context context){
        this.innertext = items;
        this.mContext = context;
    }


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

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.background_color, parent, false);
        MyViewHolder holder = new MyViewHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        String s = innertext.get(position);
        holder.t1.setText(s);

    }

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


    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public TextView t1;

        public MyViewHolder(View itemView) {
            super(itemView);
            t1 = (TextView)itemView.findViewById(R.id.t1);
            t1.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            int pos = getAdapterPosition();

            t1.setBackgroundColor(Color.parseColor("#455A64"));
            notifyItemChanged(pos);
        }

    }
}

如果您需要更多我的代码,请告诉我。

4 个答案:

答案 0 :(得分:2)

这不是一个经过验证的代码,但它会向您解释逻辑: -

public class MyAdapter extends RecyclerView.Adapter {
private List<String> innertext;
private Context mContext;
private boolean[] checked={false};

public MyAdapter(List<String> items, Context context) {
    this.innertext = items;
    this.mContext = context;
    checked = new boolean[items.size()];
}


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

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.background_color, parent, false);
    MyViewHolder holder = new MyViewHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    String s = innertext.get(position);
    ((MyViewHolder)holder).t1.setText(s);
    if(checked[position]){
        ((MyViewHolder)holder).t1.setBackgroundColor(Color.parseColor("#455A64"));
    }
}


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


class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView t1;

    public MyViewHolder(View itemView) {
        super(itemView);
        t1 = (TextView) itemView.findViewById(R.id.t1);
        t1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int pos = getAdapterPosition();
        checked[pos] = true;
        notifyItemChanged(pos);
    }

}

}

基本上你必须存储已在布尔数组中单击的位置,然后通过检查它是否已被点击在onbindview中设置颜色,因为recyclerview不按照你想的方式工作,它回收视图

答案 1 :(得分:0)

试试这个:

t1.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
         t1.setBackgroundColor(Color.parseColor("#455A64"));
    }
});

希望它有所帮助。

答案 2 :(得分:0)

这可能对您有所帮助

copy&amp;粘贴方法onBindViewHolder

中的代码

holder.t1.setOnClickListener(new OnClickListener() { public void onClick(View v) { t1.setBackgroundColor(ContextCompat.getColor(mContext, Color.parseColor("#455A64"));); } });

答案 3 :(得分:0)

+1来@ankitagrawal。我认为这是正确的解决方案!

这是我的答案。 - 相同的逻辑但不同的方法。希望我做对了,因为我没有使用AS或eclipse。我刚刚修改了@ ankitagrawal的答案。谢谢:))

<强> http://pastebin.com/C7fqhhUa