Java ViewPager+;网格视图
我在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()方法调用吗?我如何解决这个问题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一起工作的,因此如果这个解决方案涉及到切换到基于片段的方法,如果有人能够详细说明,那就太好了。因此,在
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);
}