0

我相信這只是一個簡單的錯誤,但我無法解決它。 My RecyclerView.Adapter在AsyncTask(LoadAllPersonsFromDb)的幫助下從SQLite數據庫中加載其數據。響應由回調接口(ILoadPersonFromDb.onFindAll)處理。RecyclerView.Adapter notifyDataSetChanged不能用AsyncTask回調

這裏是適配器的代碼:

public class ListViewAdapter extends RecyclerView.Adapter<ListViewViewholder> implements LoadAllPersonsFromDb.ILoadPersonFromDb { 

private int layout; 
private List<Person> persons; 
private Context context; 
private AdapterDataSetListener adapterDataSetListener; 

public ListViewAdapter(int layout, Context context, 
         AdapterDataSetListener adapterDataSetListener) { 
    this.layout = layout; 
    persons = new ArrayList<>(); 
    this.context = context; 
    this.adapterDataSetListener = adapterDataSetListener; 
    new LoadAllPersonsFromDb(context, this).execute(); 
} 

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

@Override 
public void onBindViewHolder(ListViewViewholder holder, int position) { 
    holder.assignData(persons.get(position)); 
} 

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

@Override 
public void onFindAll(List<Person> persons) { 
    Log.d("LISTVIEW", "Counted: " + persons.size() + " elements in db"); 
    if (this.persons != null) { 
     this.persons.clear(); 
     this.persons.addAll(persons); 
    } else { 
     this.persons = persons; 
    } 
    adapterDataSetListener.onChangeDataSet(); 
    //notifyDataSetChanged(); 
} 

public interface AdapterDataSetListener { 
    void onChangeDataSet(); 
} 

}

正如你所看到的,我想不止一種方法來讓它運行。簡單的notifyDataSetChanged沒有做任何事情,所以我做了另一個接口,用於將UI信息委託給相關片段。下面的代碼文件,這個接口,在與片段實施:

@Override 
public void onChangeDataSet() { 
    Log.d("Callback", "called"); 
    listViewAdapter.notifyDataSetChanged(); 
    /* 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      listViewAdapter.notifyDataSetChanged(); 
     } 
    }); 
    */ 
} 

在這裏,我也試圖把它放在MainUiThread但沒有任何工程。我只是無法看到我的問題在哪裏。希望你們中的任何人都能給我一個提示。

日誌工作,這是工作回調的證明。

預先感謝您。 PS:如果您需要更多的代碼,請告訴我,我會提供它。的

回答

0

說句大背景下,我用RecyclerView在23.1.1版本,因爲最新的23.2.0已經舉辦了巨大的空間中的一些怪異的行爲爲每張卡片。 //更新:卡之間的空間問題,是因爲佈局文件中的自己失敗(match_parent而不是wrap_content)。 -_-

結果是再次使用最新版本,一切正常。我不知道爲什麼,但現在我只是開心,我可以繼續。這個小問題浪費了足夠的時間。

也許有人有類似的情況,可以使用這種見解。

Thx無論如何@yUdoDis。

0

,而不是使用接口llistener模式,嘗試這種

@Override 
public void onFindAll(List<Person> persons) { 
    Log.d("LISTVIEW", "Counted: " + persons.size() + " elements in db"); 
    if (this.persons != null) { 
     this.persons.clear(); 
     this.persons.addAll(persons); 
    } else { 
     this.persons = persons; 
    } 
    refereshAdapter(persons); 
} 

public void refereshAdapter(List<Person> persons){ 
     listViewAdapter.clear(); 
     listViewAdapter.addAll(persons); 
     listViewAdapter.notifyDataSetChanged(); 
} 
相關問題