![](/img/trans.png)
[英]Setting ids to items in an Arraylist in a RecyclerView Android Studio
[英]RecyclerView items in ArrayList
我正在開發一個android項目,並且將一些TextViews放入RecyclerView中,與此同時,我試圖將這些內容作為ViewHolder類型放入數組列表中。 在對該程序進行了一些測試之后,我了解到插入ArrayList的項目只是屏幕上顯示的項目。 例如,如果我的屏幕適合15個textview,並且我在回收視圖和arraylist內放了30個textview,則arraylist的大小將僅為15,因此我無法對其余項目進行任何更改。
另外,當我向下滾動到回收站視圖時,arraylist會獲得滾動時已顯示的項目的大小,但是當我滾動回到頂部並嘗試更改TextViews的數量並減少程序崩潰時,它們會變大。
我想要的是在arraylist中也添加所有已添加到回收站視圖中的項目,以便可以使用它們。
回收者視圖類代碼:
public class Tab1Child1Numbers extends RecyclerView.Adapter<Tab1Child1Numbers.ViewHolder> {
ArrayList<Integer> textFront;
ArrayList<Integer> textBack;
ArrayList<Integer> colors;
Context context;
ArrayList<ViewHolder> texts = new ArrayList<>();
public Tab1Child1Numbers(Context context, ArrayList<Integer> textFront, ArrayList<Integer> textBack, ArrayList<Integer> colors) {
super();
this.context = context;
this.textFront = textFront;
this.textBack = textBack;
this.colors = colors;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.tab1_child1_numbers, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
viewHolder.textFront.setText(textFront.get(i)+"");
viewHolder.textBack.setText(textBack.get(i)+"");
viewHolder.textFront.setBackgroundColor(colors.get(i));
viewHolder.textBack.setBackgroundColor(colors.get(i));
texts.add(viewHolder);
// cardsFront.add(viewHolder.imageFront);
// cardsBack.add(viewHolder.imgThumbnail);
viewHolder.setClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
if (isLongClick) {
} else {
Deck deck = new Deck();
deck.flipCard(texts.get(position).frame, texts.get(position).textFront, texts.get(position).textBack);
}
}
});
}
@Override
public int getItemCount() {
return textFront.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public TextView textFront;
public TextView textBack;
public FrameLayout frame;
public LinearLayout layout;
private ItemClickListener clickListener;
public ViewHolder(View itemView) {
super(itemView);
textFront = (TextView) itemView.findViewById(R.id.txt1);
textBack = (TextView) itemView.findViewById(R.id.txt2);
frame = (FrameLayout) itemView.findViewById(R.id.list_frame);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
public void setClickListener(ItemClickListener itemClickListener) {
this.clickListener = itemClickListener;
}
@Override
public void onClick(View view) {
clickListener.onClick(view, getPosition(), false);
}
@Override
public boolean onLongClick(View view) {
clickListener.onClick(view, getPosition(), true);
return true;
}
}
class Deck {
private void flipCard(View rootLayout, View cardFace, View cardBack) {
FlipAnimation flipAnimation = new FlipAnimation(cardFace, cardBack);
if (cardFace.getVisibility() == View.GONE) {
flipAnimation.reverse();
}
rootLayout.startAnimation(flipAnimation);
}
public void flipAll(){
System.out.println(texts.size()+"--------");
randomize();
for (int i = 0; i < texts.size(); i++) {
flipCard(texts.get(i).frame, texts.get(i).textFront, texts.get(i).textBack);
}
}
private void randomize(){
for (int i=0; i<texts.size(); i++){
if (texts.get(i).textFront.getVisibility() == View.GONE) {
texts.get(i).textFront.setText(textFront.get(i) + "");
texts.get(i).textFront.setBackgroundColor(colors.get(i));
}
else {
texts.get(i).textBack.setText(textBack.get(i) + "");
texts.get(i).textBack.setBackgroundColor(colors.get(i));
}
}
}
}
看來您正在嘗試做不應做的事情。
每當ViewHolder
用戶顯示ViewHolder
時,系統就會調用onBindViewHolder()
。 因此,最初將為屏幕上的每個視圖調用一次,然后為屏幕外的少數視圖調用一次(以便它們可以在屏幕上很好地滾動)。
但是,這意味着當用戶滾動瀏覽適配器中的數據時,也會重復調用它。 在這些情況下, ViewHolder
傳遞給onBindViewHolder()
可能已被回收 ,這意味着它以前可能被用來顯示不同的數據,現在被重新用於顯示新的數據。
假設您的數據集中有100萬個項目,但是布局的設置方式是,一次只能在屏幕上看到15個項目。 系統很有可能會創建大約20個ViewHolder
實例(在屏幕上有15個,在屏幕外可以重用5個)。 如果用戶滾動足夠多,則將使用這20個相同的ViewHolders來顯示所有一百萬個項目。 他們只會不斷地重復使用。
這就是為什么這行有問題的原因:
texts.add(viewHolder);
您將最終建立一個列表,其中可能包含數百萬個對象,而相同的20個ViewHolder
在列表中多次出現。
這將是更好的考慮存儲在不同的方式你的數據,而不是試圖存儲ViewHolder
秒后,以onBindViewHolder()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.