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