问题
My ListView is inside PopupWindow.
When i shown PopupWindow and click on Listview row in device ASUS K00z fonepad worke very well.
But in HTC Z715e is not working (onitem click event not fired)
1.This is my listview item layout
<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.This is my popup layout
<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.This is my adapter
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.This is code i use to create and show popup
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);
}
});
How to solve it's
EDIT i can solve my problem.
replace
this.testpopup = new PopupWindow(actionview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
with
this.testpopup = new PopupWindow(actionview, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
sorry for waste time i'm very stupid.
回答1:
You can make context menu instead of popup menu it work same like this . For creating context menu just refer this link:
http://developer.android.com/guide/topics/ui/menus.html#context-menu
In this link refer to Creating Contextual Menus
.
Sort exanple on this like this u can add context menu ------ first register it in onclicklistener like
registerForContextMenu(view)
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));
}
回答2:
You may want to use ListAdapter instead of BaseAdapter for a ListView , and return True for areAllItemsEnabled and isItemEnabled in the class that implements ListAdapter.
Something like this...
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;
}
}
Good Luck. :)
来源:https://stackoverflow.com/questions/25696597/android-listview-in-popupwindow-onitemclick-not-work-on-some-device