2014-10-10 32 views
-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; 
     } 
    } 

} 
+0

是什么POSITION_NONE的价值? – 2014-10-10 12:05:57

+0

它是-2。我使用它来强制FragmentStatePagerAdapter重新加载notifyDataSetChanged()上的所有分页器内容。这似乎是提供正确的动态页面删除的唯一方法。 – user3090300 2014-10-10 12:10:01

回答

0

Aaaaand更多我已经找到了解决办法:

它似乎如果你使用多个ListFragment和ContextMenus你想分别为每个片段工作,那么你的onContextItemSelected应该是这样的:

@Override 
    public boolean onContextItemSelected(MenuItem item) 
    { 

     if(getUserVisibleHint()) 
     { 
      //Your code here 
     } 

     return super.onContextItemSelected(item); 
    } 

希望这会帮助你=)

相关问题