2016-04-12 20 views
0

ich mehrere Fragen auf Stackoverflow gelesen haben dieses Problem und zurAufnahme und Lösungen adressieren, aber immer noch kann ich nicht aktualisieren Einzelteile. Durch Drücken eines Menüsymbols wird searchString() aufgerufen. Innerhalb dieser Methode möchte ich Recyclerview Element aktualisieren, die nicht funktioniert. Hier sind Teile meines Codes:Android RecyclerView Adapter notifyDataSetChanged funktioniert nicht

/* 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); 
    } 

Irgendwelche Hilfen werden geschätzt.

+0

können Sie versuchen, rufen adapter.notifyDataSetChanged()? – Eenvincible

+0

Ja, ich habe es vorher versucht und ist gescheitert. –

Antwort

3

Verwendung

notifyItemRangeChanged(0, pgsList.size());

statt

+0

Danke @ I2S0215WMAB08. Es funktionierte und jetzt sind die Elemente aktualisiert, aber wenn ich nach unten scrolle, wird das erste Element an die letzte Position und das letzte Element an die erste Position verschoben. Kennst du seinen Grund? –

+0

Stellen Sie sicher, dass Ihr Array die richtigen Elemente an der richtigen Position hat. Auch wenn die Antwort funktioniert, würdest du es bitte akzeptieren. Vielen Dank!! –

+0

Diese 90% arbeiteten, lesen Sie den obigen Kommentar –

1

Ich würde versuchen, ein Textview-Anzeige der .mpg Zeichenfolge in Ihrem View-Layout (und binden den Wert in dem ViewHolder) hinzuzufügen, zu erkennen, wo das Problem ist.

Wenn die Artikel Strings erscheinen bedeutet, dass Ihre setPgs aktualisiert richtig die RecyclerView und das Problem ist in dem Teil WebView loadDataWithBaseURL.

+0

Danke @ctarabusi. Ich habe versucht zu überprüfen, ob (mPg! = Null) und die Sichtbarkeit von Webview ändern, aber ohne Erfolg. –

+0

Haben Sie versucht, wie ich eine Textview auf Ihrem R.layout.list_item_ebook mit dem pg als Inhalt hinzufügen vorgeschlagen? – ctarabusi

+0

Ich werde es versuchen. Gibt es einen Grund, dass Sie denken, dass das Webview die Ursache des Problems sein könnte? –

1

Versuchen Sie zu leiten die pgsList aktualisieren und dann notifyDataSetChanged rufen

Bei searchString Funktion entfernen mAdapter.setPgs(tmppgs);

und Update mAdapter wie unten richten,

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(); 
    } 

und aktualisieren updateUI() Funktion

 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

nicht funktioniert. Ich habe eine leere else {} zu updateUI() eingefügt. Wenn ich die App mit der Zurück-Taste verlasse und dann die App öffne, werden die Elemente aktualisiert. –

Verwandte Themen