簡體   English   中英

ArrayList中的RecyclerView項目

[英]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.

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