![](/img/trans.png)
[英]adapter.notifyDataSetChanged does not refreshing the recycler view
[英]View pager is not refreshing after notifyDataSetChanged
我花了很多時間,但我不能讓它工作。 我在主要活動中查看尋呼機。 在此活動中,當用戶單擊按鈕時,啟動新活動,其中用戶可以向DB添加新項目。 完成后,此活動關閉,用戶返回主要活動。 問題是我的視圖尋呼機不希望在onResume被調用時刷新。 我調試它,一切正常,但列表顯示舊數據。 但是當我滑到第三個標簽然后返回到第一個數據時,數據就可以了。 所以我在這里閱讀了許多內容,嘗試不可能,不可能,但仍然無法正常工作。 第二個問題是如果我滑到第二個選項卡然后返回到第一個然后這個列表視圖是空的但我不知道為什么。
主要活動:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
selectedDayTabPosition = position;
((OnRefreshListener) mSectionsPagerAdapter.getItem(position)).onRefresh(MainActivity.this, position);
}
});
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
actionBar.addTab(
actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(MainActivity.this));
}
}
@Override
protected void onResume() {
super.onResume();
refresh(selectedDayTabPosition);
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
public void refresh(final int position) {
subjectObjLinkedList.clear();
subjectObjLinkedList = db.getAllSubjects(position, subjectObjLinkedList);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (lvAllSubjectsAtDay != null) {
subjectsTableAdapter.notifyDataSetChanged();
Log.d("refresh()", "notifyDataSetChanged");
}
}
});
}
SectionsPagerAdapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return new PlaceholderFragment();
}
PlaceholderFragment
public class PlaceholderFragment extends Fragment implements OnRefreshListener {
private TextView tvMainPageNoSubjectLabel;
private TextView tvMainPageNoSubjectDescLabel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
lvAllSubjectsAtDay = (ListView) rootView.findViewById(R.id.lvAllSubjectsAtDay);
subjectsTableAdapter = new SubjectsTableAdapter(getActivity(), subjectObjLinkedList);
lvAllSubjectsAtDay.setAdapter(subjectsTableAdapter);
return rootView;
}
@Override
public void onRefresh(Activity activity, int position) {
refresh(position);
}
}
好吧,我發現解決方案並不完美,但正在發揮作用。 我創建了7個獨立的片段,並在onResume的片段類中調用notifyDataChanged。 當然,我從活動中刪除所有刷新方法。 我不知道為什么以前的解決方案不刷新數據,但這是有效的。
@Override
public Fragment getItem(int position) {
switch (position){
case 0: return new Fragments.FragmentTab1(db);
case 1: return new Fragments.FragmentTab2(db);
case 2: return new Fragments.FragmentTab3(db);
case 3: return new Fragments.FragmentTab4(db);
case 4: return new Fragments.FragmentTab5(db);
case 5: return new Fragments.FragmentTab6(db);
case 6: return new Fragments.FragmentTab7(db);
default: return new Fragments.FragmentTab1(db);
}
}
public static class FragmentTab1 extends Fragment {
private TextView tvMainPageNoSubjectLabel;
private TextView tvMainPageNoSubjectDescLabel;
private SubjectsTableAdapter subjectsTableAdapter = null;
private LinkedList<SubjectObj> objLinkedList = new LinkedList<>();
private MySQLiteHelper db = null;
public FragmentTab1(MySQLiteHelper db){
this.db = db;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
ListView lvAllSubjectsAtDay = (ListView) rootView.findViewById(R.id.lvAllSubjectsAtDay);
tvMainPageNoSubjectLabel = (TextView) rootView.findViewById(R.id.tvMainPageNoSubjectLabel);
tvMainPageNoSubjectDescLabel = (TextView) rootView.findViewById(R.id.tvMainPageNoSubjectDescLabel);
lvAllSubjectsAtDay.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Intent myIntent = new Intent(getActivity(), ConfigSubjectActivity.class);
myIntent.putExtra("idSelectedSubject", parent.getItemIdAtPosition(position));
getActivity().startActivity(myIntent);
return true;
}
});
subjectsTableAdapter = new SubjectsTableAdapter(getActivity(), objLinkedList);
lvAllSubjectsAtDay.setAdapter(subjectsTableAdapter);
return rootView;
}
@Override
public void onResume() {
super.onResume();
objLinkedList.clear();
objLinkedList = db.getAllSubjects(0, objLinkedList);
subjectsTableAdapter.notifyDataSetChanged();
hideDefaultLabels();
}
private void hideDefaultLabels() {
if (objLinkedList.size() > 0) {
tvMainPageNoSubjectLabel.setVisibility(View.GONE);
tvMainPageNoSubjectDescLabel.setVisibility(View.GONE);
} else {
tvMainPageNoSubjectLabel.setVisibility(View.VISIBLE);
tvMainPageNoSubjectDescLabel.setVisibility(View.VISIBLE);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.