簡體   English   中英

為什么在不通知適配器的情況下更新了RecyclerView?

[英]Why my RecyclerView updated while I don't notify the adapter?

我很難理解為什么為什么我的recyclerView僅在setAdapter()之后添加數據並且從不調用notifyDataSetChanged()之后才獲得更新!

在相同的類型中:->我在列表中添加3個字符串->僅為第一個添加的適配器通知適配器(notifyItemInserted)

結果:3顯示字符串。

如果有人可以幫助我理解我,我將非常感謝他:)

https://www.noelshack.com/2018-04-5-1516969446-recycler.png

我的代碼:

public class MainActivity extends AppCompatActivity {
List<String> mList = new ArrayList<>();

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

    //Call before set adapter so it's normal if show when the adapter is set
    mList.add("Before set the adapter");

    RecyclerView recyclerView = findViewById(R.id.rcv);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    final Adapter mAdapter = new Adapter(mList);
    recyclerView.setAdapter(mAdapter);


    Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mList.add("Button add " +0);
            mAdapter.notifyItemInserted(mList.size()-1);

            //Again it's showing but never notify
            mList.add("Button add " +1);
            mList.add("Button add " +2);
        }
    });

    //Called after setAdapter and NEVER notify the adapter but it's still show the data
    addMoreData();

}


private void addMoreData() {
    for (int i = 0; i < 10; i++) {
        mList.add("addMoreData: " + i);
    }
}


class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView nameTextView;

        ViewHolder(View itemView) {

            super(itemView);
            nameTextView = (TextView) itemView.findViewById(R.id.textview);
        }
    }

    @Override
    public Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.raw, parent, false);
        return new Adapter.ViewHolder(view);
    }

    private List<String> mList;

    Adapter(List<String> list) {
        mList = list;
    }

    @Override
    public void onBindViewHolder(Adapter.ViewHolder holder, int position) {
        holder.nameTextView.setText(mList.get(position));

    }

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

您通常使用notify調用來使當前顯示的視圖保持其正確狀態,這不會阻止Adapter將數據提供給其他RecyclerView組件。

如果您的RecyclerView滾動了,您可以很清楚地看到它-如果您在不通知的情況下更新列表,然后滾動到底部,您將布置新項目。

在您的情況下,您在最后添加項目並僅對其進行通知-購買LayoutManager確定它仍然可以布置更多視圖,因此可以。

我認為,由於notifyDataSetChanged的工作原理,這就是結果。

一位Google工程師說;

當您調用notifyDataSetChanged時,RecyclerView使數據無效,但直到下一個動畫幀才更新UI。 這就是android view system的工作方式。 當小部件失效(例如更改其數據)時,它會請求布局,這意味着它將被重新測量並在下一次視圖遍歷中重新布局。 這樣做是為了讓我們可以批量處理所有更改,直到下次屏幕更新為止。

那意味着 nofiyDataSetChanged等待UI線程。 因此,代碼中的notifyItemInserted的以下行notifyItemInserted

    mList.add("Button add " +0);
    mAdapter.notifyItemInserted(mList.size()-1);

    //Again it's showing but never notify
    mList.add("Button add " +1);
    mList.add("Button add " +2);

暫無
暫無

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

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