Android ViewPager,ListFragments以及更新列表中的元素时更新

万事须己运,他得非我贤。这篇文章主要讲述Android ViewPager,ListFragments以及更新列表中的元素时更新相关的知识,希望能为你提供帮助。
【Android ViewPager,ListFragments以及更新列表中的元素时更新】我正在编写我的第一个android应用程序作为大学课程。到目前为止,我有大部分工作,但我遇到了一个问题。
该应用程序是结构化的,所以我有一个活动,设置一个包含3个碎片的ViewPager。每个Fragment都是ListFragment的扩展,列表中填充了从数据库中提取的数据。适配器显示每个ListItem的自定义视图,其中包含一个复选框。
我想要发生的是当复选框是故障单时,所有三个片段都会更新。也就是说,为每个片段重新查询数据库,并更新列表视图。
HomeActivity。这将设置ViewPager。它添加了片段并设置了Fragment Adapter。公共类HomeActivity扩展了SherlockFragmentActivity {

private FragmentAdapter mPagerAdapter; private ViewPager mViewPager; /** * Set up the view. Add the Fragments to the viewPager, set up tabs. */ @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); getSupportActionBar(); ...//Set up Fragments. List< MemoFragment> fragments = new Vector< MemoFragment> (); fragments.add(new IncompleteMemoFragment()); fragments.add(new CompleteMemoFragment()); fragments.add(new UrgentMemoFragment()); mPagerAdapter = new FragmentAdapter(getSupportFragmentManager(), fragments); mViewPager = (ViewPager) findViewById(R.id.viewPager); mViewPager.setAdapter(mPagerAdapter); mViewPager.setOnPageChangeListener(new TabListener(mTabHost,mViewPager)); mViewPager.setOffscreenPageLimit(3); } ... }

片段适配器
public class FragmentAdapter extends FragmentPagerAdapter {private List< MemoFragment> mFragments; public FragmentAdapter(FragmentManager fm, List< MemoFragment> fragments) { super(fm); this.mFragments = fragments; }@Override public MemoFragment getItem(int position) { return mFragments.get(position); }@Override public int getCount() { return this.mFragments.size(); }}

MemoFragment类,IncompleteMemoFragment,CompleteMemoFragment,UrgentMemoFragment都扩展了它,并且99%相同,它们只是从数据库中提取一组不同的数据。
public class MemoFragment extends SherlockListFragment {protected DatabaseSource datasource; /** * Creates the View. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View rootView = inflater.inflate(R.layout.fragment_memo_list, container, false); datasource = new DatabaseSource(container.getContext()); datasource.open(); List< Memo> values = getMemos(); datasource.close(); MemoListViewAdaptor adapter = new MemoListViewAdaptor(container.getContext(), values); setListAdapter(adapter); return rootView; }/** * Gets the memos to show. * @return the memos to show. */ public List< Memo> getMemos(){ return datasource.getAllMemos(); }}

这是MemoListViewAdapter。在这里,您将看到我试图查找更改的复选框。
public class MemoListViewAdaptor extends ArrayAdapter< Memo> { private final Context mContext; private final List< Memo> mMemos; /** * Save the context and the Memos * @param context the context to save * @param memos the memos to save. */ public MemoListViewAdaptor(Context context, List< Memo> memos) { super(context, R.layout.memo_list_row, memos); this.mContext = context; this.mMemos = memos; }/** * Get the view. Sets up the list to use the custom view. */ @Override public View getView(int position, View convertView, ViewGroup parent) {LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = inflater.inflate(R.layout.memo_list_row, parent, false); ... CheckBox done = (CheckBox) rowView.findViewById(R.id.done); Memo memo = mMemos.get(position); done.setOnClickListener(new ClickListener(memo)); if(memo.getCompleteness() == Memo.COMPLETE){ done.setChecked(true); }...return rowView; }}

而且,最后这里是Click监听器。
public class ClickListener implements OnClickListener { private Memo memo; ClickListener(Memo memo){ this.memo = memo; } @Override public void onClick(View v) { if(v.getClass() == CheckBox.class){ Log.v("com.milner.memolist", "These people are crazy. This task is done"); if(((CheckBox)v).isChecked()){ memo.setCompleteness(1); }else{ memo.setCompleteness(0); } DatabaseSource datasource = new DatabaseSource(v.getContext()); datasource.open(); datasource.updateMemo(memo); datasource.close(); }else{ ... } } }

所以你有它。多数民众赞成我到目前为止!正如你所看到的,我可能是一个非常复杂的方式...我没有太多的android经验。我想我真正想做的是在勾选复选框时重新加载所有片段。
是否有捷径可寻?有没有复杂的方法来做到这一点?我只是无法理解最后一点!
希望你能帮忙! :)
谢谢
汤姆M.
答案
是否有捷径可寻?
加:
@Override public int getItemPosition(Object object) { return POSITION_NONE; }

到你的FragmentAdapter,当你需要更新碎片时,请在notifyDataSetChanged()上调用FragmentAdapter。这将触发片段的重建。
有没有复杂的方法来做到这一点?
立即更新可见片段,以便用户看到更改并在用户尝试查看后(在开始滑动时)更新下一个片段。要检查此解决方案,请稍微了解如何在/从Fragment获取/更新ViewPager
如果您在ViewPager中只有三个片段,则将屏幕页面限制设置为2,因为您在ViewPager的任何片段的两侧最多只有两个片段。同样保持对片段的引用就像你使用Vector(使用ArrayList)(我假设)稍后访问它们将在屏幕旋转后失败,因为它们不会是ViewPager将使用的片段。

    推荐阅读