2012-05-03 10 views
3

私はViewPagerActivityに2つのビューを持っています。コンテキストメニューを登録したいと思います。私はいくつかのことを試しましたが(registerForContextMenu())、私はいつも両方のビューが第2のもののように振る舞いました。何か案は?ViewPager ContextMenuはビューごとに異なります

public class ViewPagerActivity extends UomeActivity { 

    private ViewPager viewPager;   
    private ViewPagerAdapter viewPagerAdapter; 
    private ListAdapter adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.view_pager); 

     refreshAdapter(); 
    } 

    private class ViewPagerAdapter extends PagerAdapter { 

     private final List<Transaction> accountTransactions; 
     private final List<User> accountUsers; 

     public ViewPagerAdapter() { 
      // initialize lists 
     } 

     @Override 
     public Object instantiateItem(View collection, int viewPosition) { 
      View layout; 
      ListView listView; 
      switch (viewPosition) { 
       case 0: 
        layout = LayoutInflater.from(getApplicationContext()).inflate(
          R.layout.list_account_paired_transactions, null); 

        List<PairedTransaction> pairedTransactions = getPairedTransactions(); 

        adapter = new AccountPairedTransactionItemAdapter(ViewPagerActivity.this, 
          R.layout.list_account_paired_transactions, pairedTransactions); 

        listView = (ListView) layout.findViewById(android.R.id.list); 
        listView.setOnItemClickListener(new OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, int position, 
           long id) { 
          // do something 
         } 
        }); 
        registerForContextMenu(listView); 
        break; 
       case 1: 
        layout = LayoutInflater.from(getApplicationContext()).inflate(
          R.layout.list_account_transactions, null); 
        initViewPagerInfo(layout, R.string.paired_transactions, 
          R.string.all_account_transactions, R.string.empty, viewPosition); 

        adapter = new TransactionItemAdapter(ViewPagerActivity.this, 
          R.layout.list_account_transactions, accountTransactions, 
          new UserDaoImpl(
            getApplicationContext())); 

        listView = (ListView) layout.findViewById(android.R.id.list); 
        registerForContextMenu(listView); 
        break; 
       default: 
        throw new IllegalArgumentException("Unsupported number of views."); 
      } 

      listView.setAdapter(adapter); 
      listView.setDivider(new ColorDrawable(R.color.list_separator)); 
      listView.setDividerHeight(1); 
      listView.setBackgroundColor(Color.WHITE); 
      listView.setCacheColorHint(Color.WHITE); 
      ((ViewPager) collection).addView(layout); 

      return layout; 
     } 

     // omitted 

    } 

    @Override 
    protected void onResume() { 
     refreshAdapter(); 
     super.onResume(); 
    } 

    private void refreshAdapter() { 
     viewPagerAdapter = new ViewPagerAdapter(); 
     viewPager = findById(R.id.view_pager); 
     viewPager.setAdapter(viewPagerAdapter); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { 
     menu.add(R.string.show_info); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     // TODO: toast which object has been selected 
    } 

} 

答えて

2

問題は、両方のビューが同時にインスタンス化される(ビューページを埋め込む)ということです。 2番目のビューでonRegisterForContextMenuを設定すると、最初のビューから上書きされます。

可能な解決策は、どのようなビューがonContextItemSelected方法で表示されているかを確認することです。

+0

私はそう思った。あなたはどのような視点を持っているかをチェックする方法と、適切なアイテムを入手する方法の例はありますか? – user219882

+0

おそらくもっと簡単な方法がありますが、私のアプリでこのメソッドを使っています。私はViewPagerのソースコードを使用し、現在の位置を返すメソッドを追加することによってそれを修正しました。メモリから、次のようなものを追加するだけです: 'public int getCurrentItem(){ return mCurItem; } '。 'onContextItemSelected'メソッドでこれを呼び出すことができます。 –

+0

私はそれを違ったものにしましたが、私は将来あなたのソリューションを間違いなく試してみます。いい感じです...ありがとう – user219882

関連する問題