2016-02-05 67 views
0

我遇到了一个并非新问题。有很多关于它的线程说我需要从主线程中更新它。Recycleview notifyDataSetChanged不更新数据集

我尝试这样做:

How do I make RecyclerView update its layout?

,但没有真正的工作。我怀疑我不是从主线程调用它。但我还不知道。我使用的是FragmentStatePagerAdapter,这里的代码剥离版本(一种长不幸):

public Fragment getItem(int position) { 
    BaseFragment tabFragment; 
    switch (position) { 
     default: 
     case 0: 
      tabFragment = MyTabFragment.newInstance(); 
      break; 
     case 1: 
      tabFragment = MyTabFragment.newInstance(); 
      break; 
    } 

的每个标签都有项目列表的recyclerview。现在我已经在我的标签片段中布置了一个按钮,可以触发自定义对话框。如果用户点击确定,它必须刷新对话框后面的标签,但不幸的是它永远不会。该对话框消失和选项卡背后我回收观点保持不变:(

这里是一个btnlistener对话框的剥离版本:

public class MyTabFragment extends Fragment 
{ 
    //... a bunch of code 
    private void setBtnListener(Button followBtn) { 
     followBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(final View view) { 
       if (!myData.isOK()) { 
        final MyCustomDialog dialog = new MyCustomDialog(view.getContext(), myData, null); 
        dialog.setListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          // up to this point the code works. 
          OnTestClick click = new OnTestClick(myData, null); 
          click.onClick(view); 
          dialog.dismiss(); 

          // now the dialog goes away and I must refresh the tabs behind the dialog 
          // this tries to do it, but it does not work! 
          fetchMessages(); 
         } 
        }); 
        dialog.show(); 
       } 
      } 
     }); 
    } 
} 

如果你读它,到目前为止,你很耐心:)

现在是我尝试刷新标签:

public class MyTabFragment extends Fragment 
{ 
    //... a bunch of code 
    void fetchMessages() { 
     mMessagesTask = new MyMessagesTask(getAppContext(), mMessageType); 
     mMessagesTask.setCallback(new MyMessagesTask.OnResult(){ 
      @Override 
      public void onFinished() { 
       setIsLoading(false); 
       if (mList != null) { 
        MyMessagesRecyclerAdapter adapter = ((MyMessagesRecyclerAdapter) mList.getAdapter()); 
        // it gets here, but the recycle view never refreshes :(
        adapter.notifyDataSetChanged(); 
        Log.d("[test]", "callback called but the tabs still show old messages"); 
       } 
      } 
     }); 
     mMessagesTask.execute(mVenue); 
    } 
} 

终于我的自定义任务

public class MyMessagesTask extends AsyncTask<MyData, Void, Void> { 
    //... a bunch of code 
    private OnResult mCallback; 

    public void setCallback(OnResult mCallback) { 
     this.mCallback = mCallback; 
    } 

    public interface OnResult { 
     void onFinished(); 
    } 

    @Override 
    protected void onPostExecute(Void param) { 
     super.onPostExecute(param); 

     if (mCallback != null) { 
      mCallback.onFinished(); 
     } 
    } 
    //... a bunch of code 
} 

有一堆东西我没有包括,但希望有人可以发现这个问题。

thx!

+0

是否要更新布局而不进行任何数据更改? –

+0

您是否将项目添加到mList? –

+0

更新列表,然后在适配器上调用notifyDataSetChanged()。 –

回答

0

您需要在使用片段对象的布局中更改,如果片段的情况下,如果您可以传递ArrayList,则notifydatasetChange正在工作。在片段的情况下,不可更改,因为每当uoy通知适配器时它将发送一个新对象