簡體   English   中英

選擇多個卡片視圖時,Android適配器不起作用

[英]Android Adapter doesn't work when selecting multiple cardviews

我有一個問題,我不明白為什么我的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();
     }
    }

問題如下:

  • 您在列表中的第一個PersonasViewHolder上執行長按。
  • 然后,在onLongClickListener中,更改該持有人的背景顏色。
  • 但是,該持有人隨后在回收者視圖中重新用於以后的職位,給人的感覺是背景在以后的元素中重復出現。

您可以通過將每個Cardview的狀態存儲在數組中,然后為每個位置綁定正確的顏色來解決此問題。 我修改了您的代碼以顯示此想法:

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.
    }
}

我解決了我的問題。 問題是卡片視圖的位置。

我聲明全局變量

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;
        }
    });

和驗證

還有一個onBindViewHolder中的if

 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();
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM