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); } } 

}

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.