Recycleview notifyDataSetChanged不更新数据集

时间:2016-02-05 04:09:01

标签: android android-recyclerview

我遇到了一个不新的问题。关于它有许多线索说我需要从主线程更新它。

我试过了:

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!

1 个答案:

答案 0 :(得分:0)

你需要在Frag中使用Fragment对象进行更改,如果是碎片,你可以传递ArrayList然后notifydatasetChange正在工作。如果是碎片,则无法进行更改,因为每当uoy通知适配器时它会发送一个新对象