java-ViewPager GridView onItemClick

java-ViewPager GridView onItemClick,第1张

概述我在ViewPager的布局中有一个GridView(我不确定这是否有所不同).insideSampleAdapterforViewPager{@OverridepublicObjectinstantiateItem(ViewGroupcontainer,intposition){Viewpage=null;if(position==0){

我在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有点贪婪. One solution涉及覆盖VIEwPager的ViewGroup.onInterceptTouchEvent(MotionEvent ev).但是,这并不总是必需的.具体来说,我无法在不执行此 *** 作的情况下为传呼器设置onClickListener,但是为传呼器内的视图设置onClickListener对我而言非常合适(我在最后附加了一个代码示例).但是,我从未使用GrIDVIEw / onItemClickListener完成此 *** 作.实际上,您正在做的是为您的传呼器内的视图(位于下一层)内的视图设置点击侦听器.当您在AndroID中嵌套事物时,由于系统处理消耗点击的方式,触摸事件的管理变得更加复杂.

您遇到的问题是,某些事件正在消耗您的触摸事件,而没有将其传递给列表项.本质上,AndroID处理触摸事件的方式是,当发生触摸事件时,会将其传递给顶级视图的触摸事件处理函数.如果视图处理该事件,则返回true,并且系统知道该事件已处理且已完成.如果该视图不想处理该事件,则返回false,然后系统将该事件传递到层次结构中的下一个最高视图.在您的情况下,某个事件(可能是VIEwPager或可能是GrIDVIEw)会在事件未击中您的网格项目之前就将其消耗掉,因此onItemClickListener永远不会被触发.

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

(注意:显然,这两个解决方案都需要花费大量时间,因此在执行任何一项 *** 作之前,只需确保已仔细检查是否存在任何简单的错误,例如将Listener放在错误的视图上,误读了行为并认为不是触发时等)

作为参考,这是一个有效的InstantiateItem方法的版本(实际上仍在进行中,因此不是100%漂亮). “菜单”视图是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全部内容,希望文章能够帮你解决java-ViewPager GridView onItemClick所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1086222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存