Android 弹出窗口中的ListView
我已经四处搜索了几个小时,没有找到任何东西可以解决我的问题。我有一个使用弹出窗口的应用程序。在弹出窗口中,我想在手机上显示联系人列表,这部分我正在工作。我创建了一个扩展ArrayAdapter的a适配器,并让它在列表中填充电话联系人 但现在我想与这些联系人进行交互,即单击其中一个,然后向用户显示联系人的信息。我向列表中添加了一个MClickListener(),但它从未被调用。我尝试过使单元格不可聚焦,我尝试过将onClickListeners添加到每个项目中,但这并没有突出显示单元格。我被卡住了 下面是我用来设置ListView并将onItemClick侦听器添加到列表视图的代码Android 弹出窗口中的ListView,android,listview,onclick,popupwindow,Android,Listview,Onclick,Popupwindow,我已经四处搜索了几个小时,没有找到任何东西可以解决我的问题。我有一个使用弹出窗口的应用程序。在弹出窗口中,我想在手机上显示联系人列表,这部分我正在工作。我创建了一个扩展ArrayAdapter的a适配器,并让它在列表中填充电话联系人 但现在我想与这些联系人进行交互,即单击其中一个,然后向用户显示联系人的信息。我向列表中添加了一个MClickListener(),但它从未被调用。我尝试过使单元格不可聚焦,我尝试过将onClickListeners添加到每个项目中,但这并没有突出显示单元格。我被卡住
ListView contactList = (ListView) contentView.findViewById(R.id.contacts_list);
ContactsProcessing processContacts = new ContactsProcessing();
contactList.setAdapter(processContacts.getListAdapter());
contactList.setItemsCanFocus(false);
contactList.setFocusableInTouchMode(false);
contactList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> l, View v, int position, long id) {
// TODO Auto-generated method stub
// super.onListItemClick(l, v, position, id);
Toast toast = new Toast(MainActivity.this);
toast.setText("Item Clicked");
toast.show();
m_ButtonFeedback.hapticFeedback();
Log.d("MainActivity", "Item Clicked");
}
});
这是我手机的XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@android:color/transparent"
android:id="@+id/contact_cell_root" >
<TextView
android:id="@+id/contact_cell_headerText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:paddingLeft="15dp"
android:scrollbars="none"
android:textColor="#29abe2"
android:textSize="18sp"
android:textStyle="bold"
android:visibility="gone" />
<View
android:id="@+id/contact_cell_header_divider"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#29abe2"
android:visibility="gone"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:gravity="center"
android:paddingRight="10dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/contact_cell_user_image"
android:adjustViewBounds="true"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:scaleType="centerInside"
android:src="@drawable/contact_default"
android:focusable="false" />
<LinearLayout
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:adjustViewBounds="true"
android:orientation="vertical"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/contact_cell_titleText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:ellipsize="end"
android:singleLine="true"
android:text="John Smith"
android:textStyle="bold"
android:textSize="16sp"
android:textColor="@android:color/black"/>
<TextView
android:id="@+id/contact_cell_companyName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/titleText"
android:ellipsize="end"
android:text="Company Name"
android:textSize="14sp"
android:textColor="@android:color/darker_gray" />
</LinearLayout>
<ImageView
android:id="@+id/contact_cell_imageView"
android:layout_width="40dp"
android:layout_height="40dp"
android:gravity="center_vertical"
android:src="@drawable/ic_launcher"
android:scaleType="centerInside"
android:focusable="false"
/>
</LinearLayout>
<View
android:id="@+id/contact_cell_divider"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:background="#e7e7e7"
/>
</LinearLayout>
解决此问题的一种方法是创建一个对话框,然后使用setItems()命令,如果您看到这里:
向下滚动到“添加列表”,这里有一个示例,您可以在每个项目上定义onClick()结果是,创建的弹出窗口不可聚焦。简单的解决方法是告诉弹出窗口是可聚焦的
PopupWindow window;
window = new PopupWindow(context);
window.setFocusable(true);
一旦聚焦,视图中的所有组件都处于活动状态。看起来我的解决方案是Scott已经尝试过的解决方案之一,但如果有人仍在寻找某种实现,我将在这里发布 所以我也遇到了同样的问题,但在我的例子中,
setfocusable(false)
是必需的(在我的例子中,使用ListPopupWindow
不是一个解决方案,因为项目中的很多东西已经使用了basepoupwindow
的功能,包括扩展)
如果有人处于相同的情况下,有一种基于bug讨论的解决方法(第9篇)
其主要思想是,ListView
的层次结构仍然接收触摸事件,因此我们可以手动触发onItemClick()
然而,这种方法与realListView的触摸处理(比如点击一行时没有选择的光晕)并不是100%完全相同,这在目前对我来说做得很好
如果有人对此问题有更精确的解决方案,请分享
因此,这里是完整的适配器
代码,可以与列表视图
一起使用弹出窗口
中的设置焦点(false)
:
私有类CustomAdapter扩展了ArrayAdapter{
private LayoutInflater mInflater;
private ListView mOwningListView;
public CustomAdapter(Context context, List<String> objects, ListView listView) {
super(context, android.R.layout.simple_list_item_1, objects);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mOwningListView = listView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.font_pick_row, null);
}
// this is the key point of workaround
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*
* as every row is still receiving their touches
* we can use this to manually trigger onItemClick
* since it doesn't firing in popupWindow.setFocusable(false)
*/
mOwningListView.getOnItemClickListener().onItemClick(mOwningListView, v, position, getItemId(position));
}
});
//... other stuff
return convertView;
}
private layoutiner mInflater;
私有ListView-mOwningListView;
公共CustomAdapter(上下文上下文、列表对象、ListView ListView){
super(context,android.R.layout.simple\u list\u item\u 1,objects);
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
mOwningListView=listView;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=mInflater.flate(R.layout.font\u pick\u row,空);
}
//这是解决方案的关键点
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
/*
*因为每一排都还在接受他们的抚摸
*我们可以使用它手动触发onItemClick
*因为它不会在popupWindow.setFocusable中触发(false)
*/
mOwningListView.getOnItemClickListener().onItemClick(mOwningListView,v,位置,getItemId(位置));
}
});
//…其他东西
返回视图;
}
}执行此操作时,会将关键事件释放到基础活动中。这意味着你不能捕获并使用它们。谢谢Scott,但在我的情况下不起作用!为此,我创建了一个自定义适配器,并在getView()中添加了视图中的onCLickListener()。添加listview的PopupWindow编码在哪里?我在PopupWindow中添加ListView时遇到了一个问题。这是一个解决聚焦问题的好方法(错误),我在花了几个小时修复了我的应用程序的行为之后,刚刚实现了这个解决方案,现在这实际上使我放弃的事情成为可能。非常感谢你的贡献。
private LayoutInflater mInflater;
private ListView mOwningListView;
public CustomAdapter(Context context, List<String> objects, ListView listView) {
super(context, android.R.layout.simple_list_item_1, objects);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mOwningListView = listView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.font_pick_row, null);
}
// this is the key point of workaround
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*
* as every row is still receiving their touches
* we can use this to manually trigger onItemClick
* since it doesn't firing in popupWindow.setFocusable(false)
*/
mOwningListView.getOnItemClickListener().onItemClick(mOwningListView, v, position, getItemId(position));
}
});
//... other stuff
return convertView;
}