未调用 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” IDR.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?