listview OnItemClick 侦听器在片段中不起作用

Posted

技术标签:

【中文标题】listview OnItemClick 侦听器在片段中不起作用【英文标题】:listview OnItemClick listener not work in fragment 【发布时间】:2014-04-20 15:43:36 【问题描述】:

我在片段中使用了列表视图,但我使用的列表 onItemClick 监听器不起作用。下面是我的代码以及如何完善解决方案。

 public class StoreProfileFragment extends Fragment
        ListView lv;
        ArrayList<MyStore_list_dto> list = new ArrayList<MyStore_list_dto>();
        MyApplication app;
        MyListAdapter adtstore;
        View rootView;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) 

            View rootView = inflater.inflate(R.layout.fragment_store_profile, container, false);
            app = (MyApplication) getActivity().getApplicationContext();

            list = DBAdpter.getMyStoreData(app.getUserID());
            lv = (ListView) rootView.findViewById(R.id.myStore_listview);

    adtstore = new MyListAdapter(getActivity().getApplicationContext());
        lv.setAdapter(adtstore);
        lv.setOnItemClickListener(new OnItemClickListener() 

            public void onItemClick(AdapterView<?> a, View v, int position,
                    long id) 
                Log.v("log_tag", "List Item Click");
            
        );


            return rootView;
        
        public class MyListAdapter extends BaseAdapter 
            private LayoutInflater mInflater;

            public MyListAdapter(Context context) 
                mInflater = LayoutInflater.from(context);

            

            public int getCount() 
                return list.size();
            

            public Object getItem(int position) 
                return position;
            

            public long getItemId(int position) 
                return position;
            

            public View getView(final int position, View convertView,
                    ViewGroup parent) 
                convertView = mInflater.inflate(R.layout.custome_mystorelist,
                        null);
                ImageButton store_Name_img = (ImageButton) convertView
                        .findViewById(R.id.my_Store_logo_image);

                TextView store_Name_txt = (TextView) convertView
                        .findViewById(R.id.mystore_list_name);


                store_Name_txt.setText( list.get(position).name);



                if (list.get(position).image != null) 
                    byte[] Image_getByte;
                    try 
                        Image_getByte = Base64.decode(list.get(position).image);
                        ByteArrayInputStream bytes = new ByteArrayInputStream(
                                Image_getByte);
                        BitmapDrawable bmd = new BitmapDrawable(bytes);
                        Bitmap bm = bmd.getBitmap();
                        store_Name_img.setImageBitmap(bm);

                     catch (IOException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
                
                store_Name_img.setOnClickListener(new View.OnClickListener() 

                    @Override
                    public void onClick(View v) 
                        // TODO Auto-generated method stub
                        FragmentManager fm = getFragmentManager();
                        FragmentTransaction fragmentTransaction = fm
                                .beginTransaction();
                        MyStoreItemFragment fm2 = new MyStoreItemFragment();
                        fragmentTransaction.replace(R.id.rela_myStore_fragment,
                                fm2, "HELLO");
                        fragmentTransaction.addToBackStack(null);
                        fragmentTransaction.commit();
                        Bundle bundle = new Bundle();
                        bundle.putString("position", list.get(position).store_id);
                        fm2.setArguments(bundle);

                    
                );

                return convertView;
            
        
    

下面xml文件中的ListView:

<ListView
    android:id="@+id/myStore_listview"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:layout_marginTop="5dp"
    android:dividerHeight="0dip"
     >
</ListView>

自定义列表项xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rela_store_fragment"
    android:layout_
    android:layout_
    android:layout_marginTop="5dip"
    android:background="@android:color/white" >


        <ImageButton
            android:id="@+id/my_Store_logo_image"
            android:layout_
            android:layout_
             android:layout_margin="5dip" />

        <TextView
            android:id="@+id/mystore_list_name"
            android:layout_
            android:layout_
            android:layout_alignBottom="@+id/my_Store_logo_image"
            android:layout_marginBottom="18dp"
            android:layout_marginLeft="18dp"
            android:layout_toRightOf="@+id/my_Store_logo_image"
             android:layout_margin="5dip"
            android:text="dfdsfds"
            android:textColor="#040404"
            android:textSize="15sp"
            android:textStyle="bold"
            android:typeface="sans"  />

</RelativeLayout>

【问题讨论】:

见***.com/questions/5551042/…或***.com/questions/2098558/… 【参考方案1】:

添加这个

android:descendantFocusability="blocksDescendants"

listItem.xml中的RelativeLayout。

我猜ImageButton 会在您单击列表行时获得焦点。

编辑:

考虑使用ViewHolder 模式

参考:

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

【讨论】:

@crickpatel0024 单击列表行时会发生什么。 imagebutton 是否获得焦点。检查 @crickpatel0024 很高兴为您提供帮助。另一个建议使用ViewHolder 有助于提高性能 我花了大约 6 个小时来解决 ListView OnItemClick in fragment 问题(API19)。在 Fragment.onCreateView(); 中移动 rootview.findViewById...将适配器移至此处;更改了片段、列表视图和列表视图项目中的布局类型...;记录和调试所有内容:fragmentActivity、RootView、container、listview、convertedView 等...所以,在 ListView 的项目布局中绝对必须有: 1) android:descendantFocusability="blocksDescendants"; 2) android:clickable="false" - 甚至更好地从 ListView 项中删除 android:clickable。非常感谢! 最佳答案。【参考方案2】:

在您的自定义 xml 文件中添加这些属性

 android:focusableInTouchMode="false"
 android:focusable="false"

用于您的 TextView 和 ImageButton。

【讨论】:

【参考方案3】:

每当您列出的项目包含类似按钮的内容时,就会出现此类问题。 你应该在你的适配器类中使用视图持有者。

 private class ViewHolder
           ImageButton imagebutton;
           TextView textView;        

         

在您的 getview 方法中使用它。希望这对你有用。

【讨论】:

ViewHolder 确实有助于提高性能。但这与 item clikc listener 有什么关系? @Raghunandan 您所说的非常正确,但是当列表项包含类似按钮复选框的元素时,它只会阻止选择 itemview 项。详情见this。解释得很好。 完整阅读帖子以了解您刚刚链接的博客,尤其是为什么,我的项目视图不再可点击?【参考方案4】:

给你:改用 onActivityCreated() 并在此处使用代码:

@Override
    public void onActivityCreated(Bundle savedInstanceState) 
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        ListView lv1 = (ListView)getActivity().findViewById(R.id.myStore_listview);
        adtstore = new MyListAdapter(getActivity().getApplicationContext());
        lv.setAdapter(adtstore);
        lv1.setOnItemClickListener(new OnItemClickListener() 

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

                Toast.makeText(getActivity(), "Item clicked : " + position, Toast.LENGTH_SHORT).show();

            

        );

    

现在应该可以工作了.. :)

【讨论】:

以上是关于listview OnItemClick 侦听器在片段中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

按钮 onClick 和 ListView onItemClick

在 LinearLayout 中获取 onItemClick 实现的位置

OnItemClick 侦听器和单击的 View 项的可见性

ListView android上的复选框

OnItemClick 永远不会被调用 ListView 中的按钮

ListView:如何从列表中访问视图以更改背景颜色?