대학의 교과목으로 내 안드로이드 앱을 쓰고 있습니다. 지금까지 대부분의 일이 진행되었지만 문제가 생겼습니다.Android ViewPager, ListFragments 및 목록의 요소가 변경된 경우 업데이트
앱에 구조가 있으므로 3 개의 파편이있는 ViewPager를 설정하는 활동이 있습니다. 각 Fragment는 ListFragment의 확장이며 목록은 데이터베이스에서 가져온 데이터로 채워집니다. 어댑터에는 각 ListItem에 대한 사용자 지정보기가 표시되며 여기에는 확인란이 포함됩니다.
내가 원하는 것은 세 개의 조각이 모두 업데이트 된 티켓 인 경우입니다. 즉, 각 조각에 대해 데이터베이스가 다시 쿼리되고 목록보기가 업데이트됩니다.
HomeActivity. 이것은 ViewPager를 설정합니다. 조각을 추가하고 Fragment Adapter를 설정합니다. 공용 클래스 HomeActivity는 {
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 % 동일하고, 그들은 단지 다른 세트를 끌어 SherlockFragmentActivity 확장 데이터베이스의 데이터
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;
}
}
마지막으로 여기는 클릭 목록입니다.
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", "MotherFuckers be 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{
...
}
}
}
그래서, 당신이 가지고 있습니다. 그게 내가 지금까지 가지고있는 것! 당신이 볼 수 있듯이 나는 아마 이것을 매우 복잡한 방식으로 해왔습니다 ... 나는 안드로이드에 대한 많은 경험이 없습니다. 내가 정말로하고 싶은 것은 체크 박스가 체크되어있을 때 모든 조각을 다시로드하는 것입니다.
쉬운 방법이 있나요? 이 작업을 수행하는 복잡한 방법이 있습니까? 나는이 마지막 비트 주위에 내 머리를 얻을 수 없어!
희망을 도울 수 있습니다. :)
감사
톰 M
감사! 첫 번째 방법이 효과적입니다. 나는 오프 스크린 페이지 한도를 바꾸었고, 나는 4 조각을 가지고있었습니다. 단지 그것을 바꾸는 것을 잊었습니다. 나는 ArrayList를 통해 'Vector'를 사용하는 것에 대해 확신이 없었습니다.이 모든 것을 다룰 때 다른 웹 사이트에서 본 방법 이었지만 나중에 액세스 할 수는 없었습니다. 'ViewPager'의 각 프래그먼트의'FragmentAdapter'는 서로 다르지만 모두 동일한 기본 유형 ('MemoFragment')을 확장합니다. 그걸 설정하는 더 좋은 방법이 있습니까? –
@TomasMilner * 위치를 기준으로'getItem()'메서드에서 프래그먼트를 빌드하는 더 나은 방법이 있습니다. 그러나 벡터에서 해당 조각에 액세스하지 않으려는 경우이를 사용할 수도 있습니다. – Luksprog
아 좋아. 감사! :) –