android - PagerAdapter 中的 ClickListener 在错误的位置触发

标签 android

我正在使用 this project (Android-Coverflow)在我的应用程序中,它按预期工作,但有一个异常(exception):在 instantiateItem 中的单个项目上设置 View.OnClickListener 时,我确实得到了错误的位置,即:

  • 中间项返回正确的位置。
  • 中间item右边的item显示正确位置(middle-item + 1)
  • 中间项左侧的项显示错误的位置:与右侧的项相同。

因此,如果我滚动到目前为止索引为 3 的项目位于中间,我会得到

  • 3 代表中间项目(正确)
  • 4 代表右边的项目(正确)
  • 4 代表左边的项目(错误)

我在 instantiateItem 方法中添加了 ClickListener,所以我希望它是正确的...

我可能在这里遗漏了什么?

我将改编后的项目上传到 Github:https://github.com/haemi/Android-Coverflow-Clicklistener-Issue - 在“transformer coverflow 2”中,问题是可见的。相应的代码在这里:https://github.com/haemi/Android-Coverflow-Clicklistener-Issue/blob/master/app/src/main/java/me/crosswall/coverflow/demo/Normal2Activity.java#L63

最佳答案

试试这个,

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

}

关于android - PagerAdapter 中的 ClickListener 在错误的位置触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39327906/

相关文章:

java - 尝试使用 URI 构建器构建的 url 执行 get 请求

java - Eclipse IDE 要求更新 ADT-Plugin

android - 如何从 Application 对象调用 Activity 方法 finish()?

android - NoSuchMethodError : java. lang.Long.hashCode

android - ListView:如何等到它加载完毕?

android - 找不到与给定名称 '@style/Widget.RatingBar.Small' 匹配的资源

Android Studio 说数据库为空,但实际上不是

android - 安全 API key 安卓

android截取屏幕外页面

android - 隐藏(或变暗)Android Wear 充电图标