ViewPager con ContextMenu que es diferente para cada vista

Tengo un ViewPagerActivity con dos vistas. Quiero registrar un menú contextual, diferente para cada vista. Probé algunas cosas (registerForContextMenu()) pero siempre terminé con ambas vistas comportándose como la segunda. ¿Algunas ideas?

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
    }

}

preguntado el 03 de mayo de 12 a las 11:05

1 Respuestas

El problema es que ambas vistas se instancian al mismo tiempo (llenando el visor). Configuración de la onRegisterForContextMenu en la segunda vista lo sobrescribe desde la primera vista.

Una posible solución sería verificar qué vista está visible en usted onContextItemSelected método.

contestado el 03 de mayo de 12 a las 12:05

Ya me lo imaginaba. ¿Tiene algún ejemplo de cómo verificar qué vista tengo y cómo obtener el elemento correcto? - user219882

Probablemente haya una manera más simple para su problema, pero he usado este método en mis aplicaciones. Usé el código fuente de un ViewPager y lo modifiqué agregando un método para devolver la posición actual. De memoria solo necesitas agregar algo como: public int getCurrentItem() { return mCurItem; }. A continuación, puede llamar a esto en su onContextItemSelected método. - David Scott

Lo hice de manera diferente, pero definitivamente probaré tu solución en el futuro. Parece agradable... Gracias - user219882

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.