【发布时间】:2016-02-05 04:09:00
【问题描述】:
我遇到了一个并不新鲜的问题。有很多线程说我需要从主线程更新它。
我试过了:
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;
}
每个选项卡都有一个带有项目列表的回收站视图。现在我在我的选项卡片段中布局了一个触发自定义对话框的按钮。如果用户单击确定,它必须刷新对话框后面的选项卡,但不幸的是它永远不会刷新。对话框消失,标签后面的回收站视图保持不变:(
这是带有 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
}
有很多东西我没有包括在内,但希望有人能发现问题。
谢谢!
【问题讨论】:
-
您想在不更改任何数据的情况下更新布局吗?
-
您是否将项目添加到 mList 中?
-
更新列表,然后调用适配器上的 notifyDataSetChanged()。
-
我尝试更新数据,但仍然没有刷新。有没有办法刷新整个布局?
-
我试图更新数据是什么意思?为了根据项目列表中的内容进行布局更新,您的片段和适配器共享相同的列表实例或适配器列表实例与片段所拥有的对齐非常重要。从您的代码中不清楚
MyMessagesRecyclerAdapter是如何初始化的。
标签: android android-recyclerview