删除页面时在 ViewPager 中切换按钮状态

Toggle Button State in ViewPager when a page is removed

我有一个切换按钮(在所有页面中)允许用户喜欢页面(viewpager 的)的内容。

当用户喜欢某个页面时,该页面将从 viewpager 中删除。

下面是循环

User "Unlikes" -> Updates SQLite -> NotifyDatasetChanged() -> Fragments Rebuilt -> Viewpager displayed

问题是假设我在位置 2 并且我 "unlike" - 页面被删除 - 在它的位置放置了一个新页面,其切换按钮状态与已删除页面的切换按钮状态相同,而我期望根据游标返回的实际值设置切换按钮状态。

即使 ToggleButton 的 "isChecked()" 状态为 "true" 并且作为 rootview 的一部分在 getItem() 中返回 - 并且也在我创建的模拟 TextView 中显示 - 不知何故"Checked" 已删除页面的状态得以保留。

适配器

public class CursorPagerAdapter extends FragmentStatePagerAdapter {
    .
    .
    public Fragment getItem(int position) {
        Fragment fragment = null;

            if (mCursor.moveToPosition(position)) {
                Bundle arguments = new Bundle();
                fragment = new myDetailFragment();
                fragment.setArguments(arguments);
            }
        return fragment;

    }
}

人口

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            ToggleButton addFav = (ToggleButton) rootView.findViewById(R.id.addFavorite);

            .
            .

             if (item_status.equals("0")) {
                addFav.setChecked(false);
                afw.setBackgroundColor(Color.GRAY);
             } else (item_status.equals("1")) {
                addFav.setChecked(true);
                afw.setBackgroundColor(Color.RED);
             }

            .
            .

            addFav.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        final Context ctx = getActivity();
                        ContentValues values = new ContentValues(1);
                        SharedPreferences prefs = getActivity().getSharedPreferences("com.dap.qgit", Context.MODE_PRIVATE);
                        ToggleButton tb = (ToggleButton) v;
                        if (tb.isChecked()) {
                            values.put(DataProvider.COL_ITEM_STATUS, "1");
                        } else {
                            values.put(DataProvider.COL_ITEM_STATUS, "0");
                        }

                        String[] args = new String[1];
                        args[0] = "" + tb.getTag();
                        ctx.getContentResolver().update(DataProvider.CONTENT_URI_ITEM, values, "item_id=?", args);
                        getContext().getContentResolver().notifyChange(DataProvider.CONTENT_URI_TAG_ITEMS,null);

                    }
                });
      }

FragmentStatePagerAdapter 实现中使用 动态 数据集(例如 Cursor.

)时,您需要考虑几件事情

问题

  1. FragmentStatePagerAdapter 来自支持库 maps 它的实例化片段 到他们的 相应的 positions 不是他们对应的 ID,
  2. FragmentStatePagerAdapter 默认情况下不支持 动态 更改数据集,正如您通过 getItemPosition(Object object) 的实现所看到的那样,它总是 returns POSITION_UNCHANGED

解决方案

  1. 您需要使用 FragmentStatePagerAdapter 的实现,它 将其实例化片段 映射到 对应的 id来自 Cursor 并且还能够通过相应的 ID 恢复这些片段的状态
  2. 这样的适配器实现还需要return片段的适当位置根据其关联数据在Cursor中的位置通过 getItemPosition(Object object) 方法。

现在,您可以 implement/port FragmentStatePagerAdapter 来自支持库,这样的实现同时提供了 id 映射和正确的位置解析功能,或者您可以使用一些已经提供此类功能的库你,喜欢 this library which provides the first feature and the second one may be simply implemented by this GitHub Gist.

首先请阅读 "Martin Albedinsky" 回复 - 感谢他帮助我解决问题。

我在我的布局中使用了以下 XML 来规避这个问题:

                 <ToggleButton
                        .
                        .
                        .
                        android:saveEnabled="false"
                        .
                        .
                        .
                  >

虽然我没有亲自尝试过 Martin 的解决方案 - 根据他的解释,这似乎是一种更简洁的方法。

我还不确定这个对我有用的解决方案是否会导致任何 performance/untoward 问题。