ViewPager con ContextMenu que es diferente para cada vista
Frecuentes
Visto 1,431 veces
4
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
}
}
1 Respuestas
2
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java android contextmenu android-viewpager or haz tu propia pregunta.
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 suonContextItemSelected
método. - David ScottLo hice de manera diferente, pero definitivamente probaré tu solución en el futuro. Parece agradable... Gracias - user219882