gpt4 book ai didi

android - ViewPager FragmentPagerAdapter 只更新最后一个 fragment onNavigationItemSelected

转载 作者:行者123 更新时间:2023-11-30 03:38:29 31 4
gpt4 key购买 nike

我有一个 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.setListNavigationCallbacksBeerListFragment 将是唯一接收onNavigationItemSelected 回调。这就是为什么只有第二个 BeerListFragment 被排序的原因。

要解决这个问题,我建议您做几件事:

  1. 管理 BeerMenuFragment 中导航选择的回调设置,并将结果传递给处于“alive”(在 onResume 中)的子 Fragment )。您将需要使用 answers here 之一为了这样做。
  2. 存储应用的最新排序选项,并检查每个 BeerListFragmentonResume 以查看其排序是否匹配,如果不匹配,则应用排序。

这将保证您的所有排序都应用于 ViewPager 中的所有页面,无论它们在应用排序时是否显示。

关于android - ViewPager FragmentPagerAdapter 只更新最后一个 fragment onNavigationItemSelected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239512/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com