Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ViewPager+;网格视图_Java_Android_Android Viewpager - Fatal编程技术网

Java ViewPager+;网格视图

Java ViewPager+;网格视图,java,android,android-viewpager,Java,Android,Android Viewpager,我在ViewPager的布局中有一个GridView(我不确定这是否有区别) ViewPager的内置适配器{ @凌驾 公共对象实例化项(视图组容器,int位置){ 查看页面=空; 如果(位置==0){ page=GetLayoutFlater()。充气(R.layout.layoutone, 货柜(虚假);; }否则{ page=GetLayoutFlater()。充气(R.layout.LayoutTo, 货柜(虚假);; GridView grid=(GridView)page.findv

我在ViewPager的布局中有一个GridView(我不确定这是否有区别)

ViewPager的内置适配器{ @凌驾 公共对象实例化项(视图组容器,int位置){ 查看页面=空; 如果(位置==0){ page=GetLayoutFlater()。充气(R.layout.layoutone, 货柜(虚假);; }否则{ page=GetLayoutFlater()。充气(R.layout.LayoutTo, 货柜(虚假);; GridView grid=(GridView)page.findviewbyd(R.id.GridView); setOnItemClickListener(新的OnItemClickListener(){ @凌驾 公共链接(AdapterView arg0、视图arg1、, 整数arg2,长arg3){ //根据单击事件切换到其他活动 } }); setAdapter(新的GridItemAdapter(上下文));//设置自定义gridItemLayout container.addView(第页); 返回(第页); } } 我可以很好地查看网格。自定义布局也按照我的GridAdapter工作。但是,没有触发我的单击事件。这是因为实例化Item()方法调用吗?我如何解决这个问题


我还不太明白片段是如何与ViewPager一起工作的,因此如果这个解决方案涉及到切换到基于片段的方法,如果有人能够详细说明,那就太好了。

因此,在
ViewPager
中单击有点滑稽,因为
ViewPager
在捕获单击/运动事件时有点贪婪。involves覆盖了
ViewPager
。但是,这并不总是必要的。具体地说,如果不这样做,我无法为寻呼机设置onClickListener,但是为寻呼机内的视图设置onClickListener对我来说非常合适(我在最后附上了一个代码示例)。但是,我从未使用
GridView
/onItemClickListener进行过此操作。实际上,您所做的是在寻呼机的另一层中为视图内的视图设置单击侦听器。当您在Android中嵌套内容时,由于系统处理使用单击的方式,触摸事件的管理变得更加复杂

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

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

(注意:显然,这两种解决方案都需要大量的时间,因此,在您执行这两种解决方案之前,请确保您已经仔细检查了是否存在任何简单的错误,例如将听者置于错误的观点、误读行为以及认为它在启动时没有启动等。)

作为参考,这里是InstanceItem方法的一个版本,它可以正常工作(这实际上仍在进行中,所以它不是100%完美)。menupage视图是一个
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;
}

我会坚持要求您创建一个单独的
片段
,并使用
ViewPager
适配器的
getItem(position)
发送位置和实例化片段。在片段内部,您可以轻松地膨胀布局并使用
GridView

 @Override
 public Fragment getItem(int position) {
    return GridFragment.newInstance(position);
}

您当前使用的方式对我来说有点复杂。因此,我坚持让您尝试一下。一个示例演示就是我所说的方式。

您的listView中是否有可单击的对象?
如果listView或gridView项目包含可单击的视图(按钮、复选框等)您的OnItemClickListener将不会被调用。

感谢您的详细响应!我将尝试实现此功能,并进行更多调试,让您了解其工作原理。这非常有趣。ViewPager不应使用单击,但您的下一步可能是覆盖onInterceptTouchEvent并确保它返回falser单击(不过,您仍然希望它处理刷卡操作)。我在哪里覆盖实例化项()中的onInterceptTouchEvent方法?抱歉,我是ViewPagers新手。您必须实际实现自己的ViewPager类并在其中重写它。它是寻呼机本身的一个方法,而不是适配器。正如我在回答中所说,这很不幸,因为这不是最简单的操作。好的;谢谢。我将等待,看看是否有其他解决方法,但最坏的情况是,我会这么做的。:)尽管如此,还是投票支持这一努力。你能不能加入你的
GridItemAdapter
getView
功能?如果你这样做了,请告诉我,“getView”功能只会使R.layout.mycustomlayout膨胀,但我会在回家后尽快发布。谢谢你的建议!我会尽快试用它。我希望你能这么做如果我需要帮助,请告诉我-我是新手。你能更详细地说明你的代码是如何使用ListView的吗?我不知道如何使用Gri
 @Override
 public Fragment getItem(int position) {
    return GridFragment.newInstance(position);
}