java - ViewPager + GridView onItemClick

标签 java android android-viewpager

我在 ViewPager 的布局中有一个 GridView(我不确定这是否会有所不同)。

inside SampleAdapter for ViewPager{
@Override
        public Object instantiateItem(ViewGroup container, int position) {
            View page = null;
            if (position == 0) {
                page = getLayoutInflater().inflate(R.layout.layoutone,
                        container, false);
            } else {
                page = getLayoutInflater().inflate(R.layout.layouttwo,
                        container, false);
                GridView grid = (GridView) page.findViewById(R.id.gridview);
                grid.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {

                                  //switch to another activity based on click event

                    }

                });
                grid.setAdapter(new GridItemAdapter(context)); //sets custom gridItemLayout


        container.addView(page);

        return (page);

    }

}

我可以很好地查看网格。自定义布局也按照我的 GridAdapter 工作。但是,我的点击事件没有被触发。是因为调用了 instantiateItem() 方法吗?我该如何解决这个问题?

我不太明白 Fragments 如何与 ViewPager 一起工作,所以如果这个解决方案涉及切换到基于 Fragment 的方法,那么如果有人能详细说明就太好了。

最佳答案

所以,在 ViewPager 中点击有点滑稽,因为 ViewPager 在捕捉点击/ Action 事件时有点贪婪。 One solution涉及覆盖 ViewPagerViewGroup.onInterceptTouchEvent(MotionEvent ev) .然而,这并不总是必要的。具体来说,我无法在不执行此操作的情况下为寻呼机设置 onClickListener,但是为寻呼机内部的 View 设置 onClickListener 对我来说非常有效(我在最后附上了代码示例)。但是,我从未使用 GridView/onItemClickListener 完成此操作。您所做的实质上是为传呼机内的 View 内的 View 设置点击监听器,这是另一层。当您在 Android 中嵌套东西时,由于系统处理消耗点击的方式,触摸事件的管理变得更加复杂。

您遇到的问题是某些东西正在消耗您的触摸事件,而没有将其传递给列表项。本质上,Android 处理触摸事件的方式是当触摸事件发生时,将其传递给顶层 View 的触摸事件处理函数。如果 View 处理了该事件,则它返回 true,系统知道该事件已被处理并且已完成。如果 View 不想处理该事件,它会返回 false,系统会将事件传递给层次结构中的下一个最高 View 。在您的情况下,某些东西(可能是 ViewPager 或可能是 GridView)在事件到达您的网格项之前正在消耗该事件,因此永远不会触发 onItemClickListener。

作为测试,如果您可以为 GridView(如整个 View )设置一个 onClickListener 并让它正常工作,这意味着问题不在 ViewPager。在这种情况下,您可能需要实现您自己的 GridView 版本并覆盖它处理触摸事件的方式以确保该事件到达子项。但是,如果这不起作用,您将需要覆盖 ViewPager,如前所述。

(注意:显然,这两种解决方案都需要大量时间,因此在您执行任何一种解决方案之前,请确保您已经仔细检查了任何简单的错误,例如将 Listener 放在错误的 View 上,误读了行为并认为它不触发时等)

作为引用,这里是一个可用的 instantiateItem 方法的版本(这实际上仍在进行中,所以它不是 100% 漂亮)。 “menupage” View 是一个 LinearLayout

public Object instantiateItem(View collection, int position) {
    LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    int page = R.layout.menu_page;
    String meal = "";
    switch (position) {
        case 0:
            meal = "Breakfast!";
            break;
        case 1:
            meal = "Lunch!";
            break;
        case 2:
            meal = "Dinner!";
            break;
    }

    View view = inflater.inflate(page, null);
    TextView mealTitle = (TextView) view.findViewById(R.id.meal_title);
    mealTitle.setText(meal);

    ((ViewPager) collection).addView(view, 0);
    final ViewPager pager = (ViewPager)collection;

    View menupage = view.findViewById(R.id.menu_page_ll);
    menupage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            int page = ((ViewPager) pager).getCurrentItem();
            Intent i = new Intent(getApplicationContext(), Menus.class);
            i.putExtra("page", page);
            startActivity(i);
        }
    });

    return view;
}

关于java - ViewPager + GridView onItemClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12812704/

相关文章:

android - ViewPager setCurrentItem(n, false) 多次调用 instantiateItem - Android

java - 使用 Java 随机查询 Google App Engine 数据存储区实体

java - 将 OnClick 内容单独放在另一个类中

android - Google Play 开发者控制台崩溃报告

转换为 unicode 的 java 错误

android - ViewPager 中的全屏广告

java - 将对象按原样保存在数据库中还是保存为 json?

java - 如何模拟 javax.servlet.ServletInputStream

java - 单击 Spinner 时显示 DialogFragment

android - 为什么 ViewPager2 延迟加载页面?