我遇到了一个并非新问题。有很多关于它的线程说我需要从主线程中更新它。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!
是否要更新布局而不进行任何数据更改? –
您是否将项目添加到mList? –
更新列表,然后在适配器上调用notifyDataSetChanged()。 –