Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Recycleview notifyDataSetChanged未更新数据集_Android_Android Recyclerview - Fatal编程技术网

Android Recycleview notifyDataSetChanged未更新数据集

Android Recycleview notifyDataSetChanged未更新数据集,android,android-recyclerview,Android,Android Recyclerview,我遇到了一个并不新鲜的问题。有很多关于它的线程说我需要从主线程更新它 我试过这个: 但实际上不起作用。我怀疑我不是从主线程调用它。但我还不知道。我使用的是FragmentStatePagerAdapter,下面是代码的精简版本(有点长): 每个选项卡都有一个带有项目列表的recyclerview。现在,在我的选项卡片段中,我有一个触发自定义对话框的按钮。如果用户单击OK,它必须刷新对话框后面的选项卡,但不幸的是,它从来没有刷新过。对话框消失,选项卡后面的“我的回收器”视图保持不变:( 以下是带

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

我试过这个:

但实际上不起作用。我怀疑我不是从主线程调用它。但我还不知道。我使用的是FragmentStatePagerAdapter,下面是代码的精简版本(有点长):

每个选项卡都有一个带有项目列表的recyclerview。现在,在我的选项卡片段中,我有一个触发自定义对话框的按钮。如果用户单击OK,它必须刷新对话框后面的选项卡,但不幸的是,它从来没有刷新过。对话框消失,选项卡后面的“我的回收器”视图保持不变:(

以下是带有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
}
公共类MyMessagesTask扩展异步任务{
//…一堆代码
私有OnResult mCallback;
公共void setCallback(OnResult mCallback){
this.mCallback=mCallback;
}
公共接口OnResult{
void onFinished();
}
@凌驾
受保护的void onPostExecute(void参数){
super.onPostExecute(param);
如果(mCallback!=null){
mCallback.onFinished();
}
}
//…一堆代码
}
有很多东西我没有包括在内,但希望有人能发现这个问题


谢谢

如果存在碎片,则需要使用碎片对象更改布局如果可以通过ArrayList,则notifydatasetChange正在工作。如果存在碎片,则无法进行更改,因为每次uoy通知适配器时,它都会发送一个新对象

是否要在不更改任何数据的情况下更新布局?是否添加到mList的项?更新列表,然后在适配器上调用notifyDataSetChanged()。我试图更新数据,但仍然没有刷新。有没有办法刷新整个布局?我试图更新数据是什么意思?为了根据项目列表中的内容进行布局更新,您的片段和适配器必须共享同一个列表实例,或者适配器列表实例与片段所拥有的实例对齐。从您的代码中不清楚
MyMessagesRecyclerAdapter
是如何初始化的。
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
}