Подтвердить что ты не робот

ClickListener в PagerAdapter срабатывает в неправильном положении

Я использую этот проект (Android-Coverflow) в своем приложении, который работает как ожидалось с одним исключением: при установке View.OnClickListener на отдельные элементы in instantiateItem Я получаю неправильные позиции, то есть:

  • средний элемент возвращает правильную позицию.
  • Элемент справа от среднего элемента отображает правильную позицию (средний элемент + 1)
  • Элемент слева от среднего элемента отображает неправильную позицию: то же, что и элемент справа.

Итак, если я прокручиваю до сих пор, что элемент с индексом 3 находится посередине, я получаю

  • 3 для среднего элемента (правильно)
  • 4 для элемента справа (правильно)
  • 4 для элемента слева (неправильно)

Я добавляю ClickListener внутри метода instantiateItem, поэтому я ожидаю, что оно будет правильным...

Что мне, возможно, здесь не хватает?

Я загрузил адаптированный проект в Github: https://github.com/haemi/Android-Coverflow-Clicklistener-Issue - внутри "coverflow 2 трансформатора" проблема видна. Соответствующий код находится здесь: https://github.com/haemi/Android-Coverflow-Clicklistener-Issue/blob/master/app/src/main/java/me/crosswall/coverflow/demo/Normal2Activity.java#L63

4b9b3361

Ответ 1

Попробуйте это,

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

Вот полный код.

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

}