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

时间:2017-04-22 20:20:07

标签: android android-viewpager togglebutton

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

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

以下是周期

  

用户“不喜欢” - >更新SQLite - > NotifyDatasetChanged() - >片段   重建 - > Viewpager显示

问题是假设我在第2位且我“不像” - 页面被删除 - 在其位置放置一个新页面,其切换按钮状态与删除页面相同,而我期望togglebutton状态根据Cursor返回的实际值进行设置。

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

适配器

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);

                    }
                });
      }

2 个答案:

答案 0 :(得分:1)

FragmentStatePagerAdapter实施与Cursor动态数据集一起使用时,需要考虑以下几点。

问题

  1. FragmentStatePagerAdapter从支持库映射其实例化的片段到他们的对应的位置,而不是他们相应的ID
  2. 默认情况下,
  3. FragmentStatePagerAdapter不支持动态更改数据集,正如您getItemPosition(Object object)的实施所见,它始终返回POSITION_UNCHANGED
  4. 解决方案

    1. 您需要使用FragmentStatePagerAdapter的实施,其中映射其实例化的片段来自{/ 1}对应的 ID 并且还能够通过他们相应的ID 恢复那些片段的状态
    2. 此类适配器实现还需要根据Cursor中相关数据的位置返回片段的正确位置 Cursor方法。
    3. 现在,您可以从支持库实现/ port getItemPosition(Object object),因此这样的实现提供了id,映射和正确的位置解析功能,或者您可以使用一些已经为您提供此类功能的库,例如{提供第一个功能的{3}}库和第二个功能可以通过this GitHub Gist 简单实现。

答案 1 :(得分:0)

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

我在布局XML中使用了以下内容来规避问题:

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

虽然我没有亲自尝试过马丁的解决方案 - 他的解释似乎是一种更清洁的方法。

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