ClickListener en PagerAdapter se activa en la posición incorrecta
Estoy utilizando este proyecto (Android-Coverflow) en mi aplicación, que funciona como se esperaba con una excepción: al establecer un View.OnClickListener
en los elementos individuales de instantiateItem
me sale mal posiciones, es decir:
- El elemento central devuelve la posición correcta.
- El elemento a la derecha del elemento medio muestra la posición correcta (elemento medio + 1)
- El elemento a la izquierda del elemento medio muestra la posición incorrecta: el mismo que el elemento a la derecha.
Así que si estoy desplazando hasta el momento que el elemento con el índice 3 está en el medio,
- 3 para el elemento central (correcto)
- 4 para el artículo a la derecha (correcto)
- 4 para el artículo a la izquierda (equivocado)
Agregue el ClickListener
dentro del método instantiateItem
, así que esperaría que fuera correcto …
¿Qué podría estar faltando aquí?
Subí el proyecto adaptado a Github: https://github.com/haemi/Android-Coverflow-Clicklistener-Issue – dentro de "transformer coverflow 2" el problema es visible. El código correspondiente está aquí: https://github.com/haemi/Android-Coverflow-Clicklistener-Issue/blob/master/app/src/main/java/me/crosswall/coverflow/demo/Normal2Activity.java#L63
Prueba esto,
@Override public Object instantiateItem(ViewGroup container, final int position) { final TextView view = new TextView(Normal2Activity.this); view.setText("Item " + position); view.setGravity(Gravity.CENTER); view.setBackgroundColor(Color.argb(255, position * 50, position * 10, position * 50)); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Normal2Activity.this, "position: " + position, Toast.LENGTH_SHORT).show(); } }); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, final int position, Object object) { ((ViewPager) container).removeViewAt(position); }
Aquí está el código completo.
public class Normal2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_normal2); PagerContainer mContainer = (PagerContainer) findViewById(R.id.pager_container); final ViewPager pager = mContainer.getViewPager(); PagerAdapter adapter = new MyPagerAdapter(); pager.setAdapter(adapter); pager.setOffscreenPageLimit(adapter.getCount()); pager.setClipChildren(false); boolean showRotate = getIntent().getBooleanExtra("showRotate",true); if(showRotate){ new CoverFlow.Builder() .with(pager) .scale(0.3f) .pagerMargin(0f) .spaceSize(0f) .rotationY(25f) .build(); } } private class MyPagerAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, final int position) { final TextView view = new TextView(Normal2Activity.this); view.setText("Item " + position); view.setGravity(Gravity.CENTER); view.setBackgroundColor(Color.argb(255, position * 50, position * 10, position * 50)); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Normal2Activity.this, "position: " + position, Toast.LENGTH_SHORT).show(); System.out.println("position:::::::::::::" + position); } }); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, final int position, Object object) { ((ViewPager) container).removeViewAt(position); } @Override public int getCount() { return 15; } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } }
}