2015-05-12 4 views
1

У меня есть RecyclerView, который включает в себя несколько ячеек сетки. Существует кнопка TextView над кнопкой CLICK ME. Я покажу что-то, например, имя в TextView при нажатии кнопки. Проблема для меня - текст внутри TextView не является постоянным.Как сохранить статус ViewHolder в RecyclerView

Вот мой код в MainActivity:

private void initializeData(){ 
    persons = new ArrayList<>(); 
    persons.add(new Person("Name 1", "23 years old", R.drawable.a)); 
    persons.add(new Person("Name 2", "25 years old", R.drawable.b)); 
    persons.add(new Person("Name 3", "35 years old", R.drawable.c)); 
    persons.add(new Person("Name 4", "35 years old", R.drawable.c)); 
    persons.add(new Person("Name 5", "35 years old", R.drawable.c)); 
    persons.add(new Person("Name 6", "35 years old", R.drawable.c)); 
    persons.add(new Person("Name 7", "35 years old", R.drawable.c)); 
    persons.add(new Person("Name 8", "35 years old", R.drawable.c)); 
    persons.add(new Person("Name 9", "35 years old", R.drawable.c)); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    recyclerView = (RecyclerView)findViewById(R.id.my_recycler_view); 
    recyclerView.setHasFixedSize(true); 

    layoutManager = new GridLayoutManager(this, 1, LinearLayoutManager.HORIZONTAL, false); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 

    persons = new ArrayList<>(); 
    initializeData(); 

    RVAdapter adapter = new RVAdapter(persons); 
    recyclerView.setAdapter(adapter); 

    adapter.notifyDataSetChanged(); 
} 

код в моем адаптере:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{ 

List<Person> persons; 

RVAdapter(List<Person> persons){ 
    this.persons = persons; 
} 

@Override 
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cards_layout, viewGroup, false); 
    PersonViewHolder pvh = new PersonViewHolder(v); 
    return pvh; 
} 

@Override 
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { 
    personViewHolder.personName.setText(persons.get(i).name); 
    personViewHolder.personAge.setText(persons.get(i).age); 
    personViewHolder.personPhoto.setImageResource(persons.get(i).photoId); 

    final PersonViewHolder vh = personViewHolder; 
    personViewHolder.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      vh.textView.setText(vh.personName.getText().toString()); 
     } 
    }); 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 

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

public static class PersonViewHolder extends RecyclerView.ViewHolder { 
    CardView cv; 
    public TextView personName; 
    public TextView personAge; 
    ImageView personPhoto; 
    public TextView textView; 
    public Button button; 

    PersonViewHolder(View itemView) { 
     super(itemView); 
     cv = (CardView)itemView.findViewById(R.id.cv); 
     personName = (TextView)itemView.findViewById(R.id.person_name); 
     personAge = (TextView)itemView.findViewById(R.id.person_age); 
     personPhoto = (ImageView)itemView.findViewById(R.id.person_photo); 
     textView = (TextView)itemView.findViewById(R.id.text); 
     button = (Button)itemView.findViewById(R.id.button); 
    } 
} 
} 

Я думаю, что причина заключается в ViewHolder воссоздана. Как бороться с такой ситуацией? Благодарю.

enter image description here

ответ

0

Вы можете добавить логический isShowName к модели Person, то в методе onBindViewHolder():

... 
personViewHolder.button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     vh.textView.setText(vh.personName.getText().toString()); 
     persons.get(i).setIsShowName(true); // don't forget! 
    } 
}); 

if (persons.get(i).isShowName()) { 
    vh.textView.setText(vh.personName.getText().toString()); 
} else { 
    vh.textView.setText(""); 
} 
0

Добавьте логическое поле для объекта, соответствующего каждой ячейке и установить это значение для верно, когда пользователь нажимает на кнопку, а затем добавить логику для onBindViewHolder() метода:

if (clicked) { 
    showText(); 
} else { 
    hideText(); 
} 

также изменить vh.textView.setText(vh.personName.getText().toString()); до personViewHolder.personName.setText(persons.get(i).name); внутри вашего OnClickListener - вы должны хранить и запрашивать данные только с помощью List<Person> persons, а не из ViewHolder, потому что адаптер повторно использует представления, и когда вы будете запрашивать данные из ViewHolder, вы будете получать данные, ранее завышенные. Просмотров

+0

К сожалению. Не в этом дело. Например, в моем случае 9 ячеек. Я щелкнул все кнопки с 1-9 в последовательности. Но текст в ячейке 1,2,3: ** Имя 7 **, ** Имя 8 ** и ** Имя 9 **. По-видимому, они модифицируются щелчком ячейки 7,8,9. –

+0

изменить 'vh.textView.setText (vh.personName.getText(). ToString());' на 'personViewHolder.personName.setText (persons.get (i) .name);' внутри вашего OnClickListener –

Смежные вопросы