2016-04-12 3 views
0

Я прочитал несколько вопросов о stackoverflow, посвященных этой проблеме и имплантированных решениях, но все же я не могу обновлять элементы. Нажав значок меню, вызывается searchString(). Внутри этого метода я хочу обновить элемент recyclerview, который не работает. Вот связанные части моего кода:Android RecyclerView Adapter 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

Я бы попытался добавить TextView, отображающий строку mPg в макете View (и привязать значение в ViewHolder), чтобы определить, где проблема.

Если строки элементов отображаются, значит, ваш SetPgs корректно обновляет RecyclerView, и проблема возникает в части loadDataWithBaseURL WebView.

+0

Спасибо @ctarabusi. Я попытался проверить, если (mPg! = Null) и изменение видимости веб-просмотра, но без каких-либо успехов. –

+0

Пробовал ли вы, как я предложил добавить TextView в свой R.layout.list_item_ebook с pg в качестве контента? – ctarabusi

+0

Я попробую. есть ли причина, по которой вы считаете, что веб-просмотр может быть причиной проблемы? –

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

не работает. Я добавил пустое else {} в updateUI(). когда я выхожу из приложения, используя кнопку «Назад», а затем входя в приложение, элементы обновляются. –