【问题标题】:How to use OnClick in View holder?如何在 View holder 中使用 OnClick?
【发布时间】:2020-07-11 18:28:50
【问题描述】:

我想要的是……

当点击Main Activity中的按钮时,Color Selection Activity会运行,点击recycler view中的按钮,Main Activity中的按钮会变成recycler view中点击按钮的颜色。

但是recyler view 很好用,但是View Holder 里面的OnCilck 不行。

我找了很久。但我不知道原因。如果您能帮助我,我将不胜感激。

颜色选择活动

adapter = new Adapter(this, itemList, ColorSelectionActivity.this);
listview.setAdapter(adapter);

主要活动

public void onColorButtonClick(View v)
{
    Intent intent = new Intent(getApplicationContext(), ColorSelectionActivity.class);

    startActivityForResult(intent, GET_COLOR_REQUEST);
}

protected void onActivityResult(int requestCode, int resultCode, Intent intent, View v)
{
    super.onActivityResult(requestCode, resultCode, intent);

    if(requestCode == GET_COLOR_REQUEST)
    {
        if(resultCode == RESULT_OK)
        {
            GradientDrawable bgShape = (GradientDrawable) v.getBackground();

            bgShape.setColor(Color.parseColor(intent.getStringExtra("name")));
        }
    }
}

适配器

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>
{
    private ArrayList<String> itemList;
    private Context context;
    private Activity colorSelectionActivity;

public Adapter(Context context, ArrayList<String> itemList, ColorSelectionActivity colorSelectionActivity)
{
    this.context = context;
    this.itemList = itemList;
    this.colorSelectionActivity = colorSelectionActivity;
}

private Map<String, String> ColorMap()
{
    Map<String, String> colorMap = new HashMap<>();

    colorMap.put("Anger", "#ff4343");
    colorMap.put("Confusion", "#ff8e43");
    colorMap.put("Exciting", "#ffff4f");
    colorMap.put("Normal", "#85e070");
    colorMap.put("Joy", "#ffa8ab");
    colorMap.put("Sad", "#80a9e0");
    colorMap.put("Tired", "#6662bf");
    colorMap.put("Melancholy", "#bd72db");

    return colorMap;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    View view = LayoutInflater.from(context).inflate(R.layout.color_item, parent, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
    String item = itemList.get(position);

    holder.textview.setText(item);
    holder.textview.setTag(item);

    GradientDrawable bgShape = (GradientDrawable) holder.button.getBackground();

    if (ColorMap().containsKey(itemList.get(position)))
        bgShape.setColor(Color.parseColor(ColorMap().get(itemList.get(position))));
}

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

public class ViewHolder extends RecyclerView.ViewHolder
{
    public TextView textview;
    public Button button;

    public ViewHolder(View itemView)
    {
        super(itemView);

        itemView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)      //I've been debugging, this part does not work and just through.
            {
                int pos = getAdapterPosition();
                if (pos != RecyclerView.NO_POSITION)
                {
                    Intent intent = new Intent();
                    intent.putExtra("name", ColorMap().get(itemList.get((pos))));
                    colorSelectionActivity.setResult(Activity.RESULT_OK, intent);
                    notifyItemChanged(pos);
                    colorSelectionActivity.finish();
                }
            }
        });

        textview = itemView.findViewById(R.id.item_text);
        button = itemView.findViewById(R.id.item_button);
    }
}

【问题讨论】:

    标签: android android-recyclerview onclick android-viewholder


    【解决方案1】:

    把你的点击Listner放到viewholder中

    @Override
    
    public void onBindViewHolder(ViewHolder holder, int position)
    
    {
        String item = itemList.get(position);
    holder.textview.setText(item);
    holder.textview.setTag(item);
    
    GradientDrawable bgShape = (GradientDrawable) holder.button.getBackground();
    
    if (ColorMap().containsKey(itemList.get(position)))
        bgShape.setColor(Color.parseColor(ColorMap().get(itemList.get(position))));
        holder.button.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)      //I've been debugging, this part does not work and just through.
                {
                    int pos = getAdapterPosition();
                    if (pos != RecyclerView.NO_POSITION)
                    {
                        Intent intent = new Intent();
                        intent.putExtra("name", ColorMap().get(itemList.get((pos))));
                        colorSelectionActivity.setResult(Activity.RESULT_OK, intent);
                        notifyItemChanged(pos);
                        colorSelectionActivity.finish();
                    }
                }
            });
    }
    

    之前您要求回收商查看项目对您的点击列表做出响应。但现在你问了

    holder.button.setOnClickListener
    

    所以点击按钮时只有你的颜色会改变。

    【讨论】:

      【解决方案2】:

      你应该改变这个:

      itemView.setOnClickListener(new View.OnClickListener()
      {
          @Override
          public void onClick(View v)
          {
              ...
          }
      });
      

      到这里:

      itemView.button.setOnClickListener(new View.OnClickListener()
          {
              @Override
              public void onClick(View v)
              {
                  ...
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多