-1
我有一个ViewPager - > FragmentStatePagerAdapter子类 - > ListFragment子类链。当我想通过当前ListFragment中的上下文菜单删除项目时,它也会删除相邻ListFragments中的第一个项目。如果我想清除当前的ListFragment,那么它清除相邻的。我不明白为什么会发生这种情况。我怎样才能解决这个问题?FragmentPagerAdapter和它的片段contextMenu问题
这里是我的适配器代码:
mPagerAdapter = new FragmentStatePagerAdapter(fm)
{
@Override
public int getItemPosition(Object object)
{
return PagerAdapter.POSITION_NONE;
}
@Override
public Fragment getItem(int position)
{
return ProductListFragment.newInstance(position);
}
@Override
public int getCount()
{
return mLists.size();
}
};
这里我ListFragment子类的代码:google搜索了一下后
public class ProductListFragment extends ListFragment
{
public static final String LIST_POS = "com.zulfigarov.shoppingassistant.list_id";
private ProductList mList;
private ProductAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle args = getArguments();
int pos = args.getInt(LIST_POS);
mList = ListHolder.get().getLists().get(pos);
adapter = new ProductAdapter(mList);
setListAdapter(adapter);
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
registerForContextMenu(getListView());
}
@Override
public ProductAdapter getListAdapter()
{
return adapter;
}
private int selectedItemIndex;
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
if(v.getId() == getListView().getId())
{
AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
selectedItemIndex = acmi.position;
getActivity().getMenuInflater().inflate(R.menu.context_menu_for_list, menu);
}
}
public void showAddingProductDialog()
{
NewProductDialogFragment dialog = NewProductDialogFragment.newInstance();
dialog.setTargetFragment(ProductListFragment.this, NewProductDialogFragment.CREATE_NEW_PRODUCT_REQUEST);
dialog.show(this.getFragmentManager(), "add_new_product");
}
public void showChangingProductDialog(int index)
{
NewProductDialogFragment dialog = NewProductDialogFragment.newInstance(mList.get(selectedItemIndex));
dialog.setTargetFragment(ProductListFragment.this, NewProductDialogFragment.CHANGE_PRODUCT_REQUEST);
dialog.show(this.getFragmentManager(), "change_product");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch(requestCode)
{
case(NewProductDialogFragment.CREATE_NEW_PRODUCT_REQUEST):
{
if(resultCode == Activity.RESULT_OK)
{
String prodName = data.getStringExtra(NewProductDialogFragment.ADDED_PRODUCT_NAME),
prodMeasure = data.getStringExtra(NewProductDialogFragment.ADDED_PRODUCT_MEASURE),
prodAmount = data.getStringExtra(NewProductDialogFragment.ADDED_PRODUCT_AMOUNT);
addNewProduct(new Product(prodName, prodAmount, prodMeasure));
}
break;
}
case(NewProductDialogFragment.CHANGE_PRODUCT_REQUEST):
{
if(resultCode == Activity.RESULT_OK)
{
String prodName = data.getStringExtra(NewProductDialogFragment.ADDED_PRODUCT_NAME),
prodMeasure = data.getStringExtra(NewProductDialogFragment.ADDED_PRODUCT_MEASURE),
prodAmount = data.getStringExtra(NewProductDialogFragment.ADDED_PRODUCT_AMOUNT);
changeProductAtIndex(selectedItemIndex, new Product(prodName, prodAmount, prodMeasure));
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
public void addNewProduct(Product prod)
{
mList.add(0,prod);
adapter.notifyDataSetChanged();
}
public void changeProductAtIndex(int index, Product prod)
{
mList.set(index, prod);
adapter.notifyDataSetChanged();
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case(R.id.clear_current_list):
{
mList.clear();
break;
}
case(R.id.delete_current_list_item):
{
mList.remove(selectedItemIndex);
break;
}
case(R.id.edit_selected_item):
{
showChangingProductDialog(selectedItemIndex);
}
}
adapter.notifyDataSetChanged();
return super.onContextItemSelected(item);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
ListView lv = getListView();
lv.setDivider(null);
lv.setDividerHeight(0);
lv.setSelector(R.drawable.list_item_selector);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id)
{
Product prod = mList.get(position);
CheckBox isBought = (CheckBox) v.findViewById(R.id.is_bought);
isBought.setChecked(!isBought.isChecked());
prod.setBought(isBought.isChecked());
if (prod.isBought())
{
mList.remove(position);
mList.add(prod);
} else
{
mList.remove(position);
mList.add(0, prod);
}
adapter.notifyDataSetChanged();
}
public static ProductListFragment newInstance(int pos)
{
Bundle args = new Bundle();
args.putInt(LIST_POS, pos);
ProductListFragment prodListFrag = new ProductListFragment();
prodListFrag.setArguments(args);
return prodListFrag;
}
class ProductAdapter extends ArrayAdapter<Product>
{
public ProductAdapter(ProductList list)
{
super(getActivity(), 0, list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
convertView = getActivity().getLayoutInflater().inflate(
R.layout.prod_list_item, null);
Product prod = getItem(position);
TextView prodTitle = (TextView) convertView
.findViewById(R.id.prod_title);
prodTitle.setText(prod.getTitle());
TextView prodCount = (TextView) convertView
.findViewById(R.id.prod_count);
prodCount.setText(prod.getAmount() + " " + prod.getMeasure());
CheckBox isBought = (CheckBox) convertView
.findViewById(R.id.is_bought);
isBought.setChecked(prod.isBought());
return convertView;
}
}
}
是什么POSITION_NONE的价值? – 2014-10-10 12:05:57
它是-2。我使用它来强制FragmentStatePagerAdapter重新加载notifyDataSetChanged()上的所有分页器内容。这似乎是提供正确的动态页面删除的唯一方法。 – user3090300 2014-10-10 12:10:01