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