新手入門正在做一個備忘錄來學習android
新建一個條目回傳mainActivity后重繪正常顯示,問題在于再次點擊該條目修改內容回傳后,顯示的卻是最初新建后的狀態,然后在修改界面與串列界面的來回切換中條目狀態不斷在最初狀態與正常狀態間反復切換。。。
這是新建一個空條目后的狀態

這是點擊切換activity后進行修改

修改回傳后的狀態。。然后該條目的狀態就會隨 activity的切換不斷在上圖與下圖間轉換

也就是說是 串列activity每次暫停后該條目的狀態都會在正常與例外間切換 。。是不是RecycleView復用的鍋。
搞了好幾天了,只能求助了。 下面是重繪方法代碼:
/**
* 更新界面
*/
private void updateUI() {
MemoryLab memoryLab = MemoryLab.get(getActivity());//創建單例MemoryLab物件
List<Memory> memories = memoryLab.getMemories();//得到Memory串列
if(memories.size()!=0) {
mNoOneTextView.setVisibility(View.GONE);//設定資料為空時 界面的提示視圖
}
if (mAdapter == null) {
mAdapter = new MemoryAdapter(memories);//用此串列初始化mAdapter
mAdapter.setHasStableIds(true);
mMemoryRecyclerView.setAdapter(mAdapter);//將mMemoryRecyclerView與mAdapter關聯
} else {
mAdapter.notifyItemChanged(mposition);
}
}
這是自定義Adapter類的重寫方法:
@Override
public void onBindViewHolder(@NonNull MemoryHolder holder, final int position) {
Memory memory = mMemories.get(position);
holder.bind(memory);
}
@Override
public int getItemCount() {
return mMemories.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
這是自定義ViewHolder類的bind()方法:
/**
* 每次都呼叫bind(Memory)方法來顯示每一個Memory
*
* @param memory
*/
public void bind(Memory memory) {
mMemory = memory;
mTitleCheckBox.setText(" " + mMemory.getTitle());
setTime(mMemory.getDate());//設定標題和時間
mTitleCheckBox.setChecked(mMemory.isSolved());
mTitleCheckBox.setOnClickListener(new CompoundButton.OnClickListener() {
@Override
public void onClick(View view) {
mMemory.setSolved(!mMemory.isSolved());
}
});
}
uj5u.com熱心網友回復:
哪里呼叫的updateUI()?uj5u.com熱心網友回復:

在Fragment的onCreateView()和onResume()方法里
uj5u.com熱心網友回復:
List<Memory> memories = memoryLab.getMemories()mAdapter = new MemoryAdapter(memories);
這2句有問題,你的memories變成新的了,但你的adapter保存的依然是舊的(java萬物皆參考)
新手博客有詳細解釋:https://blog.csdn.net/weimingjue/article/details/87921494
常見問題4就是你的問題,建議全部看完
uj5u.com熱心網友回復:
還有你的第一次能變是因為走了adapter==null的邏輯uj5u.com熱心網友回復:
感謝您,我試了添加一個adapter的setMemories()方法來再次保存一下memories,還是不行。。
另外請教您,每次修改的都是參考物件模型層的資料,參考的物件不應該一直在更新么。。
呼叫notifyitemchanged方法不是只有第一次會重繪,是每次重繪都會變(在正常與例外之間轉換)
notifydatasetchanged方法是每次重繪只會重繪最后一個條目。。
我現在只能使用 每次重繪前都使adapter=null的蠢方法,不能實時刷。新。
我會仔細學習您的新手博客的!
uj5u.com熱心網友回復:
怪我沒仔細看,你的memoryLab是單例的,memoryLab.getMemories()看樣子也是同一個物件。getItemViewType刪掉,這是多種ui樣式回傳的可以直接搜“listview 多條目”,你這里完全沒用,如果你這樣回傳就沒有復用了
額外的代碼不需要寫在viewholder里,直接在onBindViewHolder里寫就行了(mMemory直接刪掉,改成final)這樣寫也會有復用問題。
其他就不多說了。
你給出的代碼看不出會出現來回樣式切換的問題,如果僅僅是1個條目的話應該沒有任何問題。
建議使用debug模式,可以自行搜索如何debug。
先打2個斷點:
1.在你修改的地方打斷點,看看是否修改正確
2.在你的“mTitleCheckBox.setText”這一行打上斷點,每次切換時查看” memory“里面是否是你期望的值。
uj5u.com熱心網友回復:
我猜測是你修改的時候改回默認值了,debug仔細看看uj5u.com熱心網友回復:
不是資料的問題。。還是解決不了。。按著書上(android編程權威指南)做的,這個先就這樣不能吧。一直搞這個問題,先接著往學后了,畢竟剛入門,慢慢來。。
很感謝您幫忙指導

????
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/123151.html
標籤:Android
