11

My ListView è all'interno di PopupWindow.Android Listview in PopupWindow onitemclick non funziona su alcuni dispositivi

Quando ho mostrato PopupWindow e fare clic su riga Listview nel dispositivo ASUS K00z fonepad worke molto bene.

Ma in HTC Z715e non funziona (onitem evento Click non licenziati)

1.This è il mio ListView disposizione voce

<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 è il mio layout popup

<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.Questo è il mio adattatore

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 è il codice che uso per creare e popup spettacolo

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); 
    } 
}); 

Come risolvere è

EDIT posso risolvere il mio problema.

sostituire

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

con

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

dispiace per perdere tempo io sono molto stupido.

+1

posso risolvere il mio problema si prega di vedere sotto modifica in questione. – user2955394

+1

Grazie mille, mi stavo grattando la testa da due giorni e finalmente ho trovato la soluzione, funziona benissimo. –

+0

Grazie!mi ha salvato il tempo – Dima

risposta

1

Si consiglia di utilizzare ListAdapter invece di BaseAdapter per un ListView, e restituire True per areAllItemsEnabled e isItemEnabled nella classe che implementa ListAdapter.

qualcosa di simile ...

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. :)

+0

Questo non funziona per me –

3

È possibile creare menu di scelta rapida anziché menu popup in modo che funzionino allo stesso modo. Per la creazione di menu di contesto si riferisce solo questo link:

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

In questo link si riferiscono a Creating Contextual Menus.

Ordina exanple su questo come questo u possibile aggiungere menu di contesto ------ prima registrarlo in onclicklistener come

registerForContextMenu (vista)

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)); 
}        
Problemi correlati