11

我的ListView位于PopupWindow中。PopupWindow中的Android Listview onitemclick无法在某些设备上工作

当我显示PopupWindow,并在设备华硕K00z fonepad工作非常好点击列表视图行。

但在HTC Z715E不工作(onitem单击事件不会触发)

1,本是我的列表视图项布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ln_testpopitemcon" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="52dp" 
    android:background="#3b8ed4" 
    android:descendantFocusability="blocksDescendants"> 

<ImageView 
    android:id="@+id/img_testiconmenu" 
    android:layout_margin="10dp" 
    android:layout_width="32dp" 
    android:layout_height="32dp" 
    android:src="@drawable/radio_selected" 
    android:clickable="false" 
    android:focusable="false" 
    android:focusableInTouchMode="false"/> 

    <TextView 
     android:id="@+id/tv_testtitlemenu" 
     android:gravity="left|center_vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:clickable="false" 
     android:focusable="false" 
     android:focusableInTouchMode="false"/> 

</LinearLayout> 

2,本是我的弹出式布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ln_testpopocontainer" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:paddingLeft="2dp" 
     android:paddingRight="2dp" 
     android:paddingBottom="2dp" 
     android:id="@+id/lv_testpop" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:dividerHeight="2dp" 
     android:background="#00000000" 
     android:orientation="vertical"/> 

</LinearLayout> 

3.这是我的适配器

public class testmenuadapter extends BaseAdapter{ 
    private Context context; 
    private ArrayList<MenuInfo> MenuList; 
    private LayoutInflater Layf; 

    public testmenuadapter(Context context, ArrayList<MenuInfo> menuList){ 
     this.context = context; 
     this.MenuList = menuList; 
     this.Layf = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return MenuList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return MenuList.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = Layf.inflate(R.layout.testpopoitem, null); 

      holder.img_testiconmenu = (ImageView)convertView.findViewById(R.id.img_testiconmenu); 
      holder.tv_testtitlemenu = (TextView)convertView.findViewById(R.id.tv_testtitlemenu); 
      convertView.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     MenuInfo info = MenuList.get(position); 

     if(info != null) { 
      if (holder.tv_testtitlemenu != null) { 
       holder.tv_testtitlemenu.setText(info.getTitle()); 
      } 
     } 

     return convertView; 
    } 

    public class ViewHolder 
    { 
     ImageView img_testiconmenu; 
     TextView tv_testtitlemenu; 
    } 
} 
4.本

代码是我用它来创建和显示弹出

final View actionview = inflater.inflate(R.layout.testpopo, (ViewGroup)getActivity().findViewById(R.id.ln_testpopocontainer)); 
this.testpopup = new PopupWindow(actionview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
this.testpopup.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
this.testpopup.setOutsideTouchable(false); 
this.testpopup.setAnimationStyle(R.style.Animation); 

this.testpopuplistview = (ListView)this.testpopup.getContentView().findViewById(R.id.lv_testpop); 

this.testmenupopup = new ArrayList<MenuInfo>(); 
this.testmenupopup.add(new MenuInfo("aaa", "AAA", 0, 0, false)); 
this.testmenupopup.add(new MenuInfo("bbb", "BBB", 0, 0, false)); 
this.testmenupopup.add(new MenuInfo("ccc", "CCC", 0, 0, false)); 

this.testpopadapter = new testmenuadapter(getActivity(), this.testmenupopup); 

this.testpopuplistview.setAdapter(this.testpopadapter); 
this.testpopuplistview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
     Toast.makeText(getActivity(), ((MenuInfo)adapterView.getItemAtPosition(position)).getTitle(), Toast.LENGTH_LONG).show(); 
    } 
}); 

Button btnshowpop = (Button)findViewById(R.id.btn_showpop); 
btnshowpop.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     testpopup.showAtLocation(rootView, Gravity.CENTER, 0, 0); 
    } 
}); 

如何解决它的

编辑 我可以解决我的问题。

this.testpopup = new PopupWindow(actionview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); 

抱歉浪费时间更换

this.testpopup = new PopupWindow(actionview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

我很愚蠢。

+1

我可以解决我的问题,请参见下编辑问题。 – user2955394 2014-09-06 04:13:41

+1

非常感谢你,我从两天开始抓我的头,最后我得到了你的解决方案,它真的很棒。 – 2014-12-19 04:14:22

+0

谢谢!它节省了我的时间 – Dima 2017-01-11 13:10:08

回答

1

您可能需要使用ListAdapter,而不是BaseAdapter的ListView,并返回TRUE为areAllItemsEnabled在实现ListAdapter类isItemEnabled

事情是这样的......

class CustomListAdapter implements ListAdapter { 

    Activity callingActivity; 
    ArrayList<String> items; 

    public CustomListAdapter(Activity act, ArrayList<String> list) 
    { 
     callingActivity = act; 
     items = list; 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return items.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT); 

     LinearLayout ll = new LinearLayout(callingActivity); 
     ll.setLayoutParams(params); 
     ll.setGravity(Gravity.CENTER); 
     ll.setOrientation(LinearLayout.HORIZONTAL); 
     ll.setPadding(5, 5, 5, 5); 

     // 
     // Code for your list item here... 
     // 

     return ll; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return 0; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 

    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @Override 
    public boolean areAllItemsEnabled() { 
     return true; 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return true; 
    } 

} 

好运。 :)

+0

这不适合我 – 2017-10-11 08:45:04

3

你可以使上下文菜单,而不是弹出菜单,它的工作原理是这样的。 有关创建上下文菜单只是参考以下链接:

http://developer.android.com/guide/topics/ui/menus.html#context-menu

在这个链接是指Creating Contextual Menus

排序exanple这个像这样ü可以添加上下文菜单------ 第一像onclicklistener注册它

registerForContextMenu(图)

for oncreate 
    @Override  
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) 
{ 
     menu.add(Menu.NONE, CONTEXT_MENU_UNPAIR_ITEM, Menu.NONE, "UNPAIR"); 
     menu.add(Menu.NONE, DEFAULT_DEVICE, Menu.NONE, "USE AS CGM DEVICE");   
    } 

For item selected in context menu 
@Override 
public boolean onContextItemSelected(MenuItem item) 
{ 
switch (item.getItemId()) 
{ 
case CONTEXT_MENU_UNPAIR_ITEM: 
//whatever u want 
break 
case DEFAULT_DEVICE: 
//whatever your logic accordind to u 
return(true); 
} 
return(super.onOptionsItemSelected(item)); 
}        
相关问题