- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 ViewPager
托管在一个 fragment 中,该 fragment 托管两个 ListFragments
,这两个 ListFragments
由从 SQLite 查询返回的 Cursor
填充。我最近向我的 Action Bar 添加了一个微调器,允许用户对 ViewPager
中的列表进行排序。但是,每次选择微调器时,即使当前显示第一个列表,也只会对第二个列表进行排序。看起来 ViewPager
没有跟踪当前显示的 ListFragment
。
我已经尝试在我的适配器中覆盖 getItemPosition
并使用 notifyDataSetChanged
,但这没有帮助。我尝试在 onAttach()
中缓存当前 Activity fragment 的位置也无济于事。我还尝试使用我的适配器实现的 OnSortChanged
接口(interface)来尝试重新创建 ListFragments
。我真的很茫然。这是我当前的代码:
我的主要 fragment :
public class BeerMenuFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.beer_menu_fragment, container,
false);
ViewPager pager = (ViewPager) view.findViewById(R.id.beer_pager);
pager.setAdapter(buildAdapter());
return view;
}
private PagerAdapter buildAdapter() {
return (new BeerMenuAdapter(getChildFragmentManager()));
}
}
我的FragmentPagerAdapter
:
public class BeerMenuAdapter extends FragmentPagerAdapter {
private final int NUM_ITEMS = 2;
public BeerMenuAdapter(FragmentManager fm) {
super(fm);
}
/*
* (non-Javadoc)
*
* @see android.support.v4.view.PagerAdapter#getPageTitle(int)
*/
@Override
public CharSequence getPageTitle(int position) {
return BeerListFragment.getTitle(position);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return BeerListFragment.newInstance(position);
}
}
最后,ListFragment
:
public class BeerListFragment extends SherlockListFragment implements
OnNavigationListener {
private static final String KEY_POSITION = "position";
private static final String KEY_SPINNER = "ab_spinner";
private IconicAdapter adapter;
private static final String[] LABELS = { "Newest First", "Oldest First",
"Alphabetical" };
private Context ctxt;
private int mShowItems;
private Cursor data;
private boolean synthetic = true;
static BeerListFragment newInstance(int position) {
BeerListFragment frag = new BeerListFragment();
Bundle args = new Bundle();
args.putInt(KEY_POSITION, position);
frag.setArguments(args);
return (frag);
}
static String getTitle(int position) {
String header = "Draft";
switch (position) {
case 0:
header = "Draft";
break;
case 1:
header = "Bottle";
break;
}
return (header);
}
/*
* (non-Javadoc)
*
* @see
* android.support.v4.app.ListFragment#onCreateView(android.view.LayoutInflater
* , android.view.ViewGroup, android.os.Bundle)
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View result = inflater.inflate(R.layout.menu_list_fragment, container,
false);
ctxt = getActivity().getApplicationContext();
SQLiteDatabase db = DatabaseHelper.getInstance(ctxt)
.getReadableDatabase();
SherlockFragmentActivity activity = getSherlockActivity();
ArrayAdapter<String> show = null;
ActionBar bar = activity.getSupportActionBar();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
show = new ArrayAdapter<String>(bar.getThemedContext(),
android.R.layout.simple_spinner_item, LABELS);
} else {
show = new ArrayAdapter<String>(activity,
android.R.layout.simple_spinner_item, LABELS);
}
show.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(show, this);
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState
.getInt(KEY_SPINNER));
}
data = getBeerMenuDbData(db, mShowItems);
// set up list adapter
adapter = new IconicAdapter(ctxt, data);
setListAdapter(adapter);
return (result);
}
private Cursor getBeerMenuDbData(SQLiteDatabase db, int showItems) {
String order;
String WHERE;
switch (showItems) {
case 1: // Oldest First
order = DbContract.BeerEntry.COLUMN_MODIFIED + " ASC";
break;
case 2: // Alphabetical
order = DbContract.BeerEntry.COLUMN_TITLE + " ASC";
break;
default: // Newest first
order = DbContract.BeerEntry.COLUMN_MODIFIED + " DESC";
break;
}
String[] COLUMNS = { DbContract.BeerEntry._ID,
DbContract.BeerEntry.COLUMN_TITLE,
DbContract.BeerEntry.COLUMN_MODIFIED };
WHERE = "serving='" + getTitle(getArguments().getInt(KEY_POSITION, -1))
+ "'";
return db.query(DbContract.BeerEntry.TABLE_NAME, COLUMNS, WHERE, null,
null, null, order);
}
class IconicAdapter extends CursorAdapter {
LayoutInflater inflater;
IconicAdapter(Context context, Cursor data) {
super(context, data, 0);
inflater = LayoutInflater.from(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String dateString = cursor.getString(2);
String[] dateArray = new String[3];
TextView beerName = (TextView) view.findViewById(R.id.beerName);
TextView date = (TextView) view.findViewById(R.id.drinkDate);
RatingBar rb = (RatingBar) view.findViewById(R.id.ratingBar1);
beerName.setText(cursor.getString(1));
if (!dateString.isEmpty()) {
dateArray = dateString.split("-");
date.setText(dateArray[1] + "/" + dateArray[2] + "/"
+ dateArray[0]);
} else {
date.setText(dateString);
}
rb.setRating((float) Math.random() * 5.0f);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return inflater
.inflate(R.layout.beer_club_list_item, parent, false);
}
}
/*
* (non-Javadoc)
*
* @see android.support.v4.app.Fragment#onDestroy()
*/
@Override
public void onDestroy() {
super.onDestroy();
((CursorAdapter) getListAdapter()).getCursor().close();
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
if (synthetic) {
synthetic = false;
return true;
}
mShowItems = itemPosition;
SQLiteDatabase db = DatabaseHelper.getInstance(ctxt)
.getReadableDatabase();
Cursor newData = getBeerMenuDbData(db, mShowItems);
adapter.changeCursor(newData);
return true;
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt(KEY_SPINNER, getSherlockActivity()
.getSupportActionBar().getSelectedNavigationIndex());
}
}
在此先感谢您的帮助!
最佳答案
因此,您的问题是您在 BeerListFragment
中调用了 bar.setListNavigationCallbacks(show, this)
。当您的第一个 BeerListFragment
在您的 ViewPager
中创建时,它会将自己设置为导航选择的回调。然后,当您的第二个 BeerListFragment
创建时(ViewPager
将页面恢复到当前可见页面的左侧和右侧),它将自己设置为导航选择的回调,并覆盖第一个BeerListFragment
,它现在将不再获得onNavigationItemSelected
回调。
这一切都与您所看到的行为有关,最后一个调用 bar.setListNavigationCallbacks
的 BeerListFragment
将是唯一接收onNavigationItemSelected
回调。这就是为什么只有第二个 BeerListFragment
被排序的原因。
要解决这个问题,我建议您做几件事:
BeerMenuFragment
中导航选择的回调设置,并将结果传递给处于“alive”(在 onResume 中)的子 Fragment
)。您将需要使用 answers here 之一为了这样做。BeerListFragment
的 onResume
以查看其排序是否匹配,如果不匹配,则应用排序。这将保证您的所有排序都应用于 ViewPager
中的所有页面,无论它们在应用排序时是否显示。
关于android - ViewPager FragmentPagerAdapter 只更新最后一个 fragment onNavigationItemSelected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239512/
当单击任何菜单项时,没有响应,他们应该导航到目标 fragment @Override public boolean onNavigationItemSelected(@NonNull
我想在有人点击导航 View 时调用 onNavigationItemSelected。代码不调用 onNavigationItemSelected 方法: public boolean onNav
我正在为 android 3+ 开发 在我的操作栏中,我有一个下拉列表(请参阅 how to hide/unhide the actionbar list on android 3? 了解我想要的下拉
我在我的应用程序中实现了一个导航 View ,它是由 AndroidStudio 自动创建的。当我创建一个新项目时,我选择了 NavigationDrawer Activity,菜单项看起来没问题,但
当我编写 mNavigationView.setNavigationItemSelectedListener(this); 时,应用程序崩溃在代码中如果未添加,则会删除导航栏中该项目的功能。我应该在后
我正在为一个包含抽屉的工程设计项目开发 Android 应用。我的一位小组成员选择使用 android.support.design.widget.NavigationView API 来执行此操作,
我正在使用 ActionBarSherlock 来显示微调器: ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionB
所以我在 StackOverFlow 上浏览了很多答案,但无法正常工作。我想在抽屉导航项目点击时切换 fragment 。我在 Android Studio 1.5 中使用默认的抽屉导航。 我关注了t
请有人帮我处理抽屉导航中的 fragment ,出于某种原因我无法让它们工作,但所有代码看起来都正确。 Here是源代码的链接。 最佳答案 使用这段代码: navigationView = (Navi
我有一个包含 3 个菜单项的抽屉导航。在我的 MainActivity.java 中,我设置了 onNavigationItemSelected() 监听器来处理单击的导航项。单击时,将显示一个自定义
我正在使用 Google+ 登录,这会导致 Navigation.activity。我已经按照 Google 开发人员的说明进行操作,但我只采用了登录方法(成功),但现在我卡在了 navigation
我想在应用程序启动时选择抽屉导航中的特定项目。我在 visual studio 默认模板中添加了 navigationView.SetCheckedItem(Resource.Id.nav_galle
我在 Kotlin 中制作了抽屉菜单,我想使用这个菜单项。在 java 中,我调用了 onNavigationItemSelected 方法,但是当我想在 Kotlin 中使用它时,它没有出现。这是我
我有一个 BottomNavigationView在我与 onNavigationItemSelected 的 Activity 中听众。 我有两个问题: 是否 setSelectedItemId方法
我有一个 ViewPager 托管在一个 fragment 中,该 fragment 托管两个 ListFragments,这两个 ListFragments 由从 SQLite 查询返回的 Curs
我想在下面的 Activity 中的操作栏中使用微调器是 onCreateOptionsMenu:我使用 this tutorial实现这种方法。我的问题是当 Activity 是午餐时,onNavi
我将 ActionBar 与下拉菜单一起使用,onNavigationItemSelected() 在 Activity 创建后立即被调用,因此第一个项目被调用。我的下拉菜单的第一项是主页,与使用 a
我在 DrawerLayout 中使用 NavigationView,我不确定我是否忘记了什么,但只是在我单击它时隐藏了 Navigation。 这是我的代码: 主要 Activity .java:
我已经实现了选项卡 View 以及水平滑动 View (以更改选项卡),导航模式作为应用程序的列表。我正在使用 ActionBarSherlock 和 TabPageIndicator。更改标签后,我
我从 Android Studio 3.5 模板创建了一个新的抽屉导航 Activity ,但即使我正在监听 NavigationItemSelected,菜单项也无法单击。 public class
我是一名优秀的程序员,十分优秀!