0

大学の授業として最初の Android アプリを書いています。これまでのところ、ほとんどのことが機能していますが、問題が発生しました。

アプリは構造化されているため、3 つのフラグメントを含む ViewPager を設定するアクティビティがあります。各 Fragment は ListFragment の拡張であり、リストはデータベースから取得されたデータで満たされます。アダプターは、チェックボックスを含む各 ListItem のカスタム ビューを表示します。

私がしたいのは、チェックボックスがチケットであるときに、3 つのフラグメントすべてが更新されることです。つまり、フラグメントごとにデータベースが再クエリされ、リスト ビューが更新されます。

ホームアクティビティ。これにより、ViewPager がセットアップされます。フラグメントを追加し、フラグメント アダプターをセットアップします。public class HomeActivity extends 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;
    }

}

最後にクリックリスナーです。

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

4

1 に答える 1

4

これを行う簡単な方法はありますか?

追加:

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

のフラグメント呼び出しを更新するFragmentAdapter必要がある場合はnotifyDataSetChanged()FragmentAdapter. これにより、フラグメントの再構築がトリガーされます。

これを行う複雑な方法はありますか?

表示されているフラグメントをすぐに更新して、ユーザーが変更を確認し、ユーザーが変更を表示しようとした後またはそのときに次のフラグメントを更新します (スワイプの開始時)。この解決策を確認するには、 a のFragmentin/from の取得/更新について少しグーグルで調べてくださいViewPager

に 3 つのフラグメントしかない場合はViewPager、オフスクリーン ページの制限を に設定し2ます。これは、ViewPager. また、フラグメントへの参照を( を使用して )Vector使用するように ( を使用してArrayList) 後でアクセスすると、画面の回転後に失敗します。これは、ViewPager使用するフラグメントではないためです。

于 2013-03-09T13:52:31.250 に答える