删除页面时在 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
.
)时,您需要考虑几件事情
问题
FragmentStatePagerAdapter
来自支持库 maps 它的实例化片段 到他们的 相应的 positions 不是他们对应的 ID,
FragmentStatePagerAdapter
默认情况下不支持 动态 更改数据集,正如您通过 getItemPosition(Object object)
的实现所看到的那样,它总是 returns POSITION_UNCHANGED
解决方案
- 您需要使用
FragmentStatePagerAdapter
的实现,它 将其实例化片段 映射到 对应的 id来自 Cursor
的 并且还能够通过相应的 ID 恢复这些片段的状态 ,
- 这样的适配器实现还需要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 问题。
我有一个切换按钮(在所有页面中)允许用户喜欢页面(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
.
问题
FragmentStatePagerAdapter
来自支持库 maps 它的实例化片段 到他们的 相应的 positions 不是他们对应的 ID,FragmentStatePagerAdapter
默认情况下不支持 动态 更改数据集,正如您通过getItemPosition(Object object)
的实现所看到的那样,它总是 returnsPOSITION_UNCHANGED
解决方案
- 您需要使用
FragmentStatePagerAdapter
的实现,它 将其实例化片段 映射到 对应的 id来自Cursor
的 并且还能够通过相应的 ID 恢复这些片段的状态 , - 这样的适配器实现还需要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 问题。