1

FragmentPagerAdapter が最初に作成されたときは、すべて問題ありません。ただし、アダプターの特定の位置でデータが追加または削除されると、ビューは元の位置にとどまります。

これは、私の WIP アプリの問題を示すビデオです。これは、問題を再現するために使用できる私のアプリの APKです。私の完全なコードは、私のGitHub プロジェクトで見ることができます。

これが私のアダプターコードです(こちらからも入手できます):

public class TaskListFragmentAdapter extends FragmentPagerAdapter {
    private static final String TAG = "TaskListFragmentAdapter";

    public ArrayList<Group> groups;

    /**
     * Fill constructor
     * @param fm The FragmentManager to use
     * @param groups The groups to display
     */
    public TaskListFragmentAdapter(FragmentManager fm, ArrayList<Group> groups) {
        super(fm);
        this.groups = groups;
    }

    /* (non-Javadoc)
     * Gets the fragment at position
     * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
     */
    @Override
    public TaskListFragment getItem(int position) {
        Log.v(TAG, "Getting item " + position);
        return TaskListFragment.newInstance(groups.get(position));
    }

    /* (non-Javadoc)
     * Gets the position of a fragment
     * @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
     */
    @Override
    public int getItemPosition(Object o) {
        TaskListFragment item = (TaskListFragment) o;
        int position = groups.indexOf(item.group);

        if(position >= 0) {
            Log.v(TAG, "Item found at index " + position + ": " + item.group.toString());
            return position;
        } else {
            Log.v(TAG, "Item not found");
            return POSITION_NONE;
        }
    }

    /* (non-Javadoc)
     * Gets the count of fragments
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        return groups.size();
    }

    /* (non-Javadoc)
     * Gets the title of a fragment
     * @see android.support.v4.view.PagerAdapter#getPageTitle(int)
     */
    @Override
    public CharSequence getPageTitle(int position) {
        return groups.get(position).getName();
    }
}

データを変更する方法は簡単です。アクティビティにgroupsArrayList があり、 を使用して変更されgroups.add(position, item)ます。その後、アクティビティは次のことを行います。

adapter.groups = groups;
adapter.notifyDataSetChanged();

アップデート:

コードを少し修正し、適切な .equals() メソッドをグループに追加したところ、結果が少し変わりました。 getItemPosition最初にグループを挿入すると、(位置 1 と 2 に対して) が 2 回呼び出され、最後の 2 つのグループ ビューが正しく更新されているようです。ただし、追加されたものと元の最初のものはまだ更新されていません。APKを更新しました。

グループが最初に挿入され、データセットが変更されたときのアダプターからの完全な出力を次に示します。

V/TaskListFragmentAdapter(3597): Item found at index 1: com.gawdl3y.android.tasktimer.classes.Group@b3336038
V/TaskListFragmentAdapter(3597): Item found at index 2: com.gawdl3y.android.tasktimer.classes.Group@b330f330

それでおしまい。

4

3 に答える 3

3

私はついにこの問題を解決しました。私が最終的にやったのはFragmentPagerAdapter、 のカスタム バージョンに切り替えることでしFragmentStatePagerAdapterた。結果のコードは、私のGitHub プロジェクトで見ることができます。関連するファイルはTaskListFragmentAdapter.javaNewFragmentStatePagerAdapter.javaです。このカスタム バージョンは、ここでUgglyNoodle によって作成され、自分で変更を加えたものです。

于 2013-02-21T03:47:06.550 に答える
0

ソースを調べたところ、問題は、新しいグループを追加した後、タスクでグループを更新する必要があることだと思います。3 つのグループがあり、1 つ目にいくつかのタスクがあるとします (ビデオのように)。ここで、最初のグループの前にグループを追加して、リストの位置 0 に移動します。これで 4 つのグループができましたが、新しいグループを追加する前にタスクが 0 グループにあり、更新しなかったため、タスクのグループ フィールドは 0 に設定されたままです。したがって、ViewPager がフラグメントを再作成している場合でも、タスクは目的の場所にありません。

したがって、新しいグループを追加して reorder(groups) を呼び出すときは、すべてのタスクの task.group フィールドを更新するメソッドを作成する必要があると思います。

于 2013-02-19T07:52:09.410 に答える
0

あなたの質問に対する私の理解と、あなたの情報源を簡単に読んだことから、問題はあなたが唯一の電話をかけnotifyDataSetChanged()ていることだと思いますFragmentPagerAdapter. ViewPagerただし、データ セットのこの変更についても通知する必要があります。

ViewPager Indicator ライブラリを試してみたい場合はnotifyDataSetChanged()インジケータを呼び出すこともできます。そうでない場合は、このライブラリのコードを調べて、TabPageIndicator探している効果がどのように得られるかを確認することをお勧めします。

于 2013-02-20T05:59:24.257 に答える