0

대학의 교과목으로 내 안드로이드 앱을 쓰고 있습니다. 지금까지 대부분의 일이 진행되었지만 문제가 생겼습니다.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

이 작업을 수행 할 수있는 간단한 방법이 있을까요?

추가 :

@Override 
public int getItemPosition(Object object) {  
    return POSITION_NONE; 
} 

당신의 FragmentAdapter로하고 조각이 FragmentAdapternotifyDataSetChanged() 전화를 업데이트해야 할 때. 이렇게하면 조각 조각이 다시 생성됩니다.

이 작업을 수행하는 복잡한 방법이 있습니까?

사용자가 변경 사항을보고 즉시 또는 사용자가 볼 것을 시도 할 때 (스 와이프 시작시) 다음 조각을 업데이트하도록 시각적 조각을 즉시 업데이트합니다. 이 솔루션을 확인하려면/Fragment/ViewPager에서 업데이트/가져 오기에 대해 조금.

ViewPager에 세 개의 조각이있는 경우 의 조각 한쪽에 최대 2 개의 조각 만 있으므로 화면 외부 페이지 제한을 2으로 설정하십시오. 또한 Vector (ArrayList 사용)과 같이 조각에 대한 참조를 유지하면 나중에 액세스 할 때 화면에 회전 한 후 ViewPager이 사용할 조각이 아니므로 실패 할 수 있습니다.

+0

감사! 첫 번째 방법이 효과적입니다. 나는 오프 스크린 페이지 한도를 바꾸었고, 나는 4 조각을 가지고있었습니다. 단지 그것을 바꾸는 것을 잊었습니다. 나는 ArrayList를 통해 'Vector'를 사용하는 것에 대해 확신이 없었습니다.이 모든 것을 다룰 때 다른 웹 사이트에서 본 방법 이었지만 나중에 액세스 할 수는 없었습니다. 'ViewPager'의 각 프래그먼트의'FragmentAdapter'는 서로 다르지만 모두 동일한 기본 유형 ('MemoFragment')을 확장합니다. 그걸 설정하는 더 좋은 방법이 있습니까? –

+1

@TomasMilner * 위치를 기준으로'getItem()'메서드에서 프래그먼트를 빌드하는 더 나은 방법이 있습니다. 그러나 벡터에서 해당 조각에 액세스하지 않으려는 경우이를 사용할 수도 있습니다. – Luksprog

+0

아 좋아. 감사! :) –

관련 문제