【问题标题】:Android Adapter doesn't work when selecting multiple cardviews选择多个卡片视图时,Android Adapter 不起作用
【发布时间】:2016-02-16 01:12:37
【问题描述】:

我有个问题,不明白我的CardViews为什么会有这个效果。

我需要选择一个或多个CardViews,但我的适配器不能正常工作。我的适配器实现不正确吗?

我的适配器

public class PersonasAdapter extends RecyclerView.Adapter < PersonasAdapter.PersonasViewHolder > {

 private Persona subject;
 private List < Persona > personastList;
 public PersonasAdapter() {}

 public PersonasAdapter(List < Persona > personastList) {
  this.personastList = personastList;
 }


 @Override
 public void onBindViewHolder(final PersonasViewHolder personasViewHolder, int i) {
  Persona ci = personastList.get(i);
  personasViewHolder.txtNombre.setText(ci.getNombre());
  personasViewHolder.txtUsuario.setText(ci.getUsuario());
  personasViewHolder.txtTwitter.setText(ci.getTwitter());
  subject = personastList.get(i);

  personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() {

   @Override
   public boolean onLongClick(View v) {
    Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show();
    personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary);
    return false;
   }
  });
  personasViewHolder.card_view.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    Toast.makeText(v.getContext(), "Reproducir", Toast.LENGTH_SHORT).show();
   }
  });
 }
 @Override
 public PersonasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout_persona, viewGroup, false);
  cardView
  return new PersonasViewHolder(itemView);
 }

类静态

public static class PersonasViewHolder extends RecyclerView.ViewHolder {
      protected TextView txtNombre;
      protected TextView txtUsuario;
      protected TextView txtTwitter;
      protected CardView card_view;

      public PersonasViewHolder(View v) {
       super(v);
       txtNombre = (TextView) v.findViewById(R.id.txtNombre);
       txtUsuario = (TextView) v.findViewById(R.id.txtUsuario);
       txtTwitter = (TextView) v.findViewById(R.id.txtTwitter);
       card_view = (CardView) v.findViewById(R.id.card_view);
      }
     }
     //Metodo que nos retornarta la cantidad de personas en la lista
     @Override
     public int getItemCount() {
      return personastList.size();
     }
    }

【问题讨论】:

    标签: java android android-recyclerview android-cardview onlongclicklistener


    【解决方案1】:

    问题如下:

    • 您在列表的第一个 PersonasViewHolder 上执行了长按。
    • 然后,在您的 onLongClickListener 中,更改该持有人的背景颜色。
    • 但该支架随后会被重新用于回收器视图中的后续位置,从而给人一种背景在后续元素中重复出现的感觉。

    您可以通过将每个卡片视图的状态存储在一个数组中,然后为每个位置绑定正确的颜色来修复它。我修改了你的代码来展示这个想法:

    public class PersonasAdapter extends RecyclerView.Adapter < PersonasAdapter.PersonasViewHolder > {
    
     private Persona subject;
     private List < Persona > personastList;
     private boolean[] selectedPersonas;
     public PersonasAdapter() {}
    
     public PersonasAdapter(List < Persona > personastList) {
      this.personastList = personastList;
      this.selectedPersonas = new boolean[personasList.size()];
      for (int i = 0; i < personasList.size(); i++) {
          this.selectedPersonas[i] = false;
      }
     }
    
     @Override
     public void onBindViewHolder(final PersonasViewHolder personasViewHolder, final int i) {
      Persona ci = personastList.get(i);
      personasViewHolder.txtNombre.setText(ci.getNombre());
      personasViewHolder.txtUsuario.setText(ci.getUsuario());
      personasViewHolder.txtTwitter.setText(ci.getTwitter());
      subject = personastList.get(i);
    
      updatePersonaHolderBackground(personaViewHolder, i);
    
      personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() {
    
       @Override
       public boolean onLongClick(View v) {
        Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show();
        selectedPersonas[i] = !selectedPersonas[i];
        updatePersonaHolderBackground(personaViewHolder, i);
        return false;
       }
      });
      personasViewHolder.card_view.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
        Toast.makeText(v.getContext(), "Reproducir", Toast.LENGTH_SHORT).show();
       }
      });
     }
     @Override
     public PersonasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
      View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout_persona, viewGroup, false);
      cardView
      return new PersonasViewHolder(itemView);
     }
    
    private void updatePersonaHolderBackground(final PersonasViewHolder personasViewHolder, final int i) {
        if (selectedPersonas[i]) {
               personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary);
        } else {
              // TODO: change the color of personasViewHolder back to normal using whatever color you want.
        }
    }
    

    【讨论】:

    • 什么不起作用?它是否具有与以前相同的行为?你用正确的颜色更改了 TODO 吗?
    【解决方案2】:

    我解决了我的问题。 问题是卡片视图的位置。

    我声明全局变量

    int globalPosition;
    

     personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
    Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show();
    
    
    
    personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary);
                globalPosition=i;
                notifyDataSetChanged();
                return false;
            }
        });
    

    并在

    中进行验证

    和一个 if 在 onBindViewHolder

     if (i == globalPosition) {
      personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary);
     } else {
      personasViewHolder.card_view.setBackgroundResource(R.color.colorAccent);
     }
    

    结果就是这样。

    public class PersonasAdapter extends RecyclerView.Adapter < PersonasAdapter.PersonasViewHolder > {
    
    private Persona subject;
    private List < Persona > personastList;
    public PersonasAdapter() {}
    int globalPosition;
    
    public PersonasAdapter(List < Persona > personastList) {
    this.personastList = personastList;
    }
    
    
    @Override
    public void onBindViewHolder(final PersonasViewHolder personasViewHolder, final int i) {
    Persona ci = personastList.get(i);
    personasViewHolder.txtNombre.setText(ci.getNombre());
    personasViewHolder.txtUsuario.setText(ci.getUsuario());
    personasViewHolder.txtTwitter.setText(ci.getTwitter());
    subject = personastList.get(i);
    
    
    personasViewHolder.card_view.setOnLongClickListener(new View.OnLongClickListener() {
    
    @Override
    public boolean onLongClick(View v) {
    Toast.makeText(v.getContext(), "Eliminar Cardview", Toast.LENGTH_SHORT).show();
    personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary);
    globalPosition=i;
    notifyDataSetChanged();
    return false;
    }
    });
    personasViewHolder.card_view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(v.getContext(), "Reproducir", Toast.LENGTH_SHORT).show();
    }
    });
    
    
    
    if(i==globalPosition)
    {
    //change color like
    personasViewHolder.card_view.setBackgroundResource(R.color.colorPrimary);
    
    
    }
    else
    {
    personasViewHolder.card_view.setBackgroundResource(R.color.colorAccent);
    }
    
    }
    @Override
    public PersonasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout_persona, viewGroup, false);
    
    return new PersonasViewHolder(itemView);
    }
    public static class PersonasViewHolder extends RecyclerView.ViewHolder {
    protected TextView txtNombre;
    protected TextView txtUsuario;
    protected TextView txtTwitter;
    protected CardView card_view;
    
    public PersonasViewHolder(View v) {
    super(v);
    txtNombre = (TextView) v.findViewById(R.id.txtNombre);
    txtUsuario = (TextView) v.findViewById(R.id.txtUsuario);
    txtTwitter = (TextView) v.findViewById(R.id.txtTwitter);
    card_view = (CardView) v.findViewById(R.id.card_view);
    }
    }
    //Metodo que nos retornarta la cantidad de personas en la lista
    @Override
    public int getItemCount() {
    return personastList.size();
    }
    }
    

    【讨论】:

    • 嗨,看起来不错。但令我惊讶的是,几乎每篇关于 RecyclerViews 的文章/博客都将重点放在创建列表上,但没有人关注保存列表。创建一个制作精美/有价值的列表(比如我想下载的一大串歌曲)然后如果我通过单按后退按钮离开列表,那么该列表就会被彻底销毁。为什么不保存状态代码是创建每个 RecyclerView 列表的要求,就像其他要求一样:适配器、布局管理器、onCreateViewHolder、onBindViewHolder 和 getItemCount?想法?
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多