未调用 DrawerLayout 中的自定义 BaseAdapter ListView onItemClickListener

Posted

技术标签:

【中文标题】未调用 DrawerLayout 中的自定义 BaseAdapter ListView onItemClickListener【英文标题】:Custom BaseAdapter ListView onItemClickListener in DrawerLayout Not Called 【发布时间】:2013-10-30 18:27:36 【问题描述】:

我有一个自定义基础适配器,我在 DrawerLayout 中与我的 ListView 一起使用。 ListView 膨胀正常,但我不能调用 onItemClickListener。

这是 MainAcitivty 的 onCreate 部分,我在其中设置了适配器和 onItemClickListener

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    isPhone = getResources().getString(R.string.screen_type).toString().equals("phone");
    mTitle = getResources().getString(R.string.app_name);
    mCategoryTitles = getResources().getStringArray(R.array.categories);
    mSubtext = getResources().getStringArray(R.array.subtext);



    mTitle = mDrawerTitle = getTitle();

    // Set the drawer toggle as the DrawerListener

    mDrawerList = (ListView) findViewById(R.id.left_drawer);
    BaseAdapter adapter = new NavigationListAdapter(this, mCategoryTitles, mSubtext);
    mDrawerList.setAdapter(adapter);
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    .....
 

private class DrawerItemClickListener implements ListView.OnItemClickListener 
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) 
        //selectItem(position);

        System.out.println("This is clicked");

    

这是我的基本适配器代码

public class NavigationListAdapter extends BaseAdapter 

    public static final int HDR_POS1 = 0;
    public static final int HDR_POS2 = 9;
    private static final Integer LIST_HEADER = 0;
    private static final Integer LIST_ITEM = 1;

    Context mContext;
    String[] mCategories;
    String[] mSubtext;
    private SideBarPositionClickedCommunicator mCallback;

    public interface SideBarPositionClickedCommunicator
        public void setListItemPosition(int itemInt);





    public NavigationListAdapter(Context context, String[] categories, String[] subtext)
    

        mContext = context;
        mSubtext = subtext;
        mCategories = categories;

    

    @Override
    public int getCount() 
        return mCategories.length;
    

    @Override
    public Object getItem(int position) 
        return position;
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
        final int positionClicked = position;
        String headerText = getHeader(position);

        if(headerText != null) 

            View item = convertView;
            if(convertView == null || convertView.getTag() == LIST_ITEM) 

                item = LayoutInflater.from(mContext).inflate(
                        R.layout.lv_header_layout, parent, false);
                item.setTag(LIST_HEADER);

            

            TextView headerTextView = (TextView)item.findViewById(R.id.lv_list_hdr);
            headerTextView.setText(headerText);
            return item;
        

        View item = convertView;
        if(convertView == null || convertView.getTag() == LIST_HEADER) 
            item = LayoutInflater.from(mContext).inflate(
                    R.layout.lv_layout, parent, false);
            item.setTag(LIST_ITEM);
        

        TextView header = (TextView)item.findViewById(R.id.lv_item_header);
        header.setText(mCategories[position % mCategories.length]);

        TextView subtext = (TextView)item.findViewById(R.id.lv_item_subtext);
        subtext.setText(mSubtext[position % mCategories.length]);

        //Set last divider in a sublist invisible
        View divider = item.findViewById(R.id.item_separator);
        if(position == HDR_POS2 -1) 
            divider.setVisibility(View.INVISIBLE);
        


        return item;
    


    private String getHeader(int position) 

        if(position == HDR_POS1  || position == HDR_POS2) 
            return mCategories[position].toUpperCase();
        

        return null;
    

    @Override
    public boolean isEnabled(int position) 

        if(position == HDR_POS1  || position == HDR_POS2)
            return false;
        else
            return true;



    

这是我的 XML 布局。

页眉布局:

   <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    >

<View
    android:id="@+id/item_separator"
    android:layout_alignParentBottom="true"
    android:layout_
    android:layout_
    android:background="@color/dark_gray"
    android:layout_marginTop="@dimen/lvSectionDividerMarginTop"
    />

<TextView
    android:text="This is a text"
    android:id="@+id/lv_list_hdr"
    android:textColor="@color/dark_gray"
    android:gravity="bottom|left"
    android:layout_
    android:layout_
    android:layout_above="@id/item_separator"
    android:layout_alignParentLeft="true"
    style="@style/listViewHeaderItem"
    />
</RelativeLayout>

每个订单项:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    tools:context=".MainActivity"
    style="@style/listViewItem"
    android:background="@android:drawable/list_selector_background"
    >

    <View
        android:id="@+id/item_separator"
        android:layout_alignParentBottom="true"
        android:layout_
        android:layout_
        android:background="@color/lvDividerColor"/>



    <TextView
        android:id="@+id/lv_item_header"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        style="@style/listViewPrimaryDetail"
        android:fontFamily="sans-serif-light"
        android:ellipsize="marquee"
        android:singleLine="true"
        android:text="This is a test"
        android:layout_alignParentLeft="true"
        />

    <TextView
        android:text="Of the Emergency Broadcast"
        android:id="@+id/lv_item_subtext"
        android:layout_
        android:layout_
        android:layout_below="@id/lv_item_header"
        style="@style/listViewSecondaryDetail"
        android:layout_above="@id/item_separator"
        android:layout_alignParentLeft="true"
        android:ellipsize="marquee"
        android:singleLine="true"
        />
</RelativeLayout>

最后,这里是activity_main xml

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_
    android:layout_>
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_
        android:layout_ />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@null"
        android:dividerHeight="1dp"
        android:background="#EEEEEE"/>


</android.support.v4.widget.DrawerLayout>

这是布局膨胀的结果: http://imgur.com/yWPp9ec

如果您有任何建议,请告诉我。

【问题讨论】:

有没有看到列表项,有没有在日志中看到“This is clicked” ID R.id.left_drawer 的 ListView 不在您共享的代码中。 @Raghunandan,列表项显示没有问题。我添加了列表视图的屏幕截图。我在日志中没有看到“点击了”。我尝试用一​​个简单的 String ArrayAdapter 替换我的 BaseAdapter,它可以正常工作。因此,我认为问题出在我的 BaseAdapter 中。 @AlfredoCavalcanti 添加了activity_main.xml @Tykin 你不会改变任何东西,只是扩展 arrayadapter 工作 【参考方案1】:

我发现了问题。它在我的 listViewItem 的样式部分。

<style name="listViewItem">
    <item name="android:layout_height">@dimen/lvItemHeight</item>
    <item name="android:clickable">true</item>
</style>

将 android:clickable 更改为 false 修复了该问题。

【讨论】:

以上是关于未调用 DrawerLayout 中的自定义 BaseAdapter ListView onItemClickListener的主要内容,如果未能解决你的问题,请参考以下文章

未调用自定义 UIButton 的 setIsSelected 方法

在我的自定义 collectionView 布局中未调用 prepare()

DrawerLayout 和 NavigationView - 未找到属性“菜单”

如何从 nib 中修复此“在托管对象上调用选择器 ... 已被 GC'ed”,其中包含未使用的自定义 UITableViewCell?

UITableView 原型单元上的自定义附件视图未触发

nodejs中的自定义mysql函数返回未定义