2016-04-12 121 views
0

我已經閱讀了幾個關於stackoverflow的問題,解決了這個問題並實現瞭解決方案,但我仍然無法更新項目。通過按菜單圖標,searchString()被調用。在這個方法裏面,我想更新不起作用的recyclerview項目。這裏是我的代碼的相關部分:Android RecyclerView適配器notifyDataSetChanged不工作

/* in my notation, pg is equivalent to page.*/ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_ebook_list, container, false); 
    mEbookRecyclerView = (RecyclerView) view.findViewById(R.id.ebook_recycler_view); 
    mLayoutManager = new LinearLayoutManager(getActivity()); 
    mEbookRecyclerView.setLayoutManager(mLayoutManager); 
    updateUI(); 
    return view; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    updateUI(); 
} 


private void updateUI() { 
    if (mAdapter == null) { 
     EbookLab ebookLab = EbookLab.get(getActivity()); 
     List<String> pgs = ebookLab.getPgs(); 
     mAdapter = new EbookAdapter(pgs); 
     mEbookRecyclerView.setAdapter(mAdapter); 
    } 
} 

    /* ******codes for preparation of menus which I have ignored *******/ 

    private class EbookHolder extends RecyclerView.ViewHolder { 
    private String mPg; 

    public EbookHolder(LayoutInflater inflater, ViewGroup container) { 
     super(inflater.inflate(R.layout.list_item_ebook, container, false)); 
     mListWebView = (WebView) itemView.findViewById(R.id.list_web_View); 
     mListWebView.getSettings().setLoadWithOverviewMode(true); 
    } 

    public void bindEbook(String pg) { 
     mPg = pg; 
     mListWebView.loadDataWithBaseURL("file:///android_asset/", mPg, "text/html", "UTF-8", null); 
    } 
    } 

    private class EbookAdapter extends RecyclerView.Adapter<EbookHolder> { 
    private List<String> mPgs; 
    public EbookAdapter(List<String> pgs) { 
     mPgs = pgs; 
    } 
    @Override 
    public EbookHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 
     return new EbookHolder(layoutInflater, parent); 
    } 


    @Override 
    public void onBindViewHolder(EbookHolder holder, int position) { 
     String pg = mPgs.get(position); 
     holder.bindEbook(pg); 
    } 
    @Override 
    public int getItemCount() { 
     return mPgs.size(); 
    } 
    public void setPgs(List<String> pgs) { 
     mPgs.clear(); 
     mPgs.addAll(pgs); 
     notifyDataSetChanged(); 
    } 
} 

    public void searchString(String qSrh) { 
     EbookLab ebookLab = EbookLab.get(getActivity()); 
     List<String> pgs = ebookLab.getPgs(); 
    List<String> tmppgs = new ArrayList<String>(pgs); 

    /** Some code for manipulation of tmppgs and updating recyclerview based on the tmppgs **/ 

    mAdapter.setPgs(tmppgs); 
    } 

任何幫助表示讚賞。

+0

你能嘗試調用adapter.notifyDataSetChanged()? – Eenvincible

+0

是的,我已經嘗試過,失敗了。 –

回答

3

使用

notifyItemRangeChanged(0, pgsList.size());

代替

+0

謝謝@ I2S0215WMAB08。它的工作,現在的項目更新,但當我向下滾動時,第一項被移動到最後一個位置和最後一個項目的第一個位置。你知道它的原因嗎? –

+0

確保您的陣列在正確的位置有正確的元素。如果答案有效,請您接受。謝謝!! –

+0

這90%工作,閱讀以上評論 –

1

我會嘗試在您的視圖佈局中添加一個顯示mPg字符串的TextView(並綁定ViewHolder中的值)以確定問題出在哪裏。

如果項目字符串出現意味着您的setPgs正確更新RecyclerView並且問題出現在WebView的loadDataWithBaseURL部分中。

+0

謝謝@ctarabusi。我試着檢查(mPg!= null)和改變webview的可見性,但沒有任何成功。 –

+0

您是否嘗試過使用pg作爲內容在您的R.layout.list_item_ebook上添加TextView? – ctarabusi

+0

我會試一試。是否有任何理由認爲webview可能是問題的根源? –

1

試圖引導更新pgsList,然後調用notifyDataSetChanged

searchString功能刪除 mAdapter.setPgs(tmppgs);

和更新mAdapter直接像下面,

public void searchString(String qSrh) { 
     EbookLab ebookLab = EbookLab.get(getActivity()); 
     List<String> pgs = ebookLab.getPgs(); 
     List<String> tmppgs = new ArrayList<String>(pgs); 
//  mAdapter.setPgs(tmppgs); 
     pgsList.clear(); 
     pgsList.addAll(tmppgs); 
     mAdapter.notifyDataSetChanged(); 
    } 

和更新updateUI()功能

 List<String> pgsList = new ArrayList<String>(); 
private void updateUI() { 
    if (mAdapter == null) { 
     EbookLab ebookLab = EbookLab.get(getActivity()); 
     pgsList = ebookLab.getPgs(); 
     mAdapter = new EbookAdapter(pgsList); 
     mEbookRecyclerView.setAdapter(mAdapter); 
    } 
} 
+0

沒有奏效。我已經將其他空白部分插入到updateUI()中。當我使用後退按鈕退出應用程序,然後輸入應用程序時,項目會更新。 –

相關問題