万事须己运,他得非我贤。这篇文章主要讲述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
将使用的片段。推荐阅读
- Android - 使用空textview的SwipeRefreshLayout
- 需要Android数据库帮助
- 如何将ListView标题放入Android泡泡中
- Android ListView ContextMenu
- 我可以在通用Android应用程序中使用WearableListView吗()
- 如何在Android中的ListView中突出显示行()
- Android ScrollView中的VerticalScrollExtent是什么()
- 如何在xamarin native android中的listview中为项目着色
- Android ListView固定高度项