我遇到了一個並非新問題。有很多關於它的線程說我需要從主線程中更新它。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()。 –