2012-06-28 14 views
13

Próbuję pokazać ListView z PopupWindow. ale kiedy próbuję wywołać setOnItemClickListener do listy nic do haapen. Oto on Java złożyćAndroid ListView's setOnItemClickListener z PopupWindow nie nazywane

PopupWindowActivity.java

public class PopupWindowActivity extends Activity { 
    String[] data = { "DATA 1", "DATA 2", "DATA 3", "DATA 4", "DATA 5", "DATA 6" }; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.a); 
    final Button btnOpenPopup = (Button) findViewById(R.id.openpopup); 
    btnOpenPopup.setOnClickListener(new Button.OnClickListener() { 

     public void onClick(View arg0) { 
      LayoutInflater layoutInflater = (LayoutInflater) getBaseContext() 
        .getSystemService(LAYOUT_INFLATER_SERVICE); 
      View popupView = layoutInflater.inflate(R.layout.main, null); 
      final PopupWindow popupWindow = new PopupWindow(popupView, 
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

      ListView listView = (ListView) popupView.findViewById(R.id.listView1); 
      listView.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,data)); 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int arg2, long arg3) { 
        // TODO Auto-generated method stub 
        System.out.println("Item Clicked"); 
        popupWindow.dismiss(); 
       } 
      }); 

      popupWindow.showAsDropDown(btnOpenPopup, 20, -5); 

     } 
    }); 
} 

}

Tu jest pierwszy plik xml a.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" > 

<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" /> 
<Button 
    android:id="@+id/openpopup" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Open Popup Window" /> 

</LinearLayout> 

tutaj to nadmuchać plik xml plik główny.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:background="@drawable/recording" 
android:orientation="vertical" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_marginBottom="30sp" 
    android:layout_marginLeft="30sp" 
    android:layout_marginRight="30sp" 
    android:layout_marginTop="100sp" > 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:cacheColorHint="#00000000" > 
    </ListView> 
</RelativeLayout> 

</LinearLayout> 

Co robię źle?

Dzięki

+0

mogą spróbować ListView.setAdapter (nowy ArrayAdapter (MyBannerActivity.this,? zamiast getApplicationContext(), –

+0

@ Dheeresh Singh: jak to się dzieje, nic się nie dzieje – Mansi

+0

Aktywne zdarzenie kliknięcia działa, ale kliknięcie listview elementu listy nie działa – rajpara

Odpowiedz

39

Wystarczy jedna niewielka zmiana w kodzie i Booom kodzie wysłuchają Państwo listy zdarzeń kliknięcia

final PopupWindow popupWindow = new PopupWindow(popupView, 
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,true); 

Ty zapomnij wspomnieć aktywowana ustawienie prawdziwą w PopupWindow konstruktora.

+1

Och, oczywiście, oczywiście Android Dlaczego miałbym zakładać, że PopupWindow nie byłby domyślnie ustawiony tak jak każdy inny widok, którego używałem .. Man Jestem czasem idiotą – samosaris

0

To może pomóc .

Zdeklaruj listę i listę onClickListener poza przyciskiem ClickListener.

5

miał ten sam problem, ale w moim przypadku setFocusble(false) było wymagane (i przy użyciu ListPopupWindow nie było to rozwiązanie w moim przypadku, jak wiele rzeczy w projekcie funkcjonalności już używanych PopupWindow bazowe „s tym rozszerzenie).

Jeśli ktoś w tej samej sytuacji istnieje rodzaj obejścia na podstawie błędów discusson here (po 9)

Główną ideą jest to, że hierarchia ListView „s jest nadal odbiera zdarzenia dotykowe, dzięki czemu możemy ręcznie wywołać onItemClick() .

Jednak to podejście nie jest w 100% identyczne z rzeczywistym dotykaniem ListView (jak nie ma poświaty selekcji podczas stukania w rząd), co na razie całkiem mi się przydało.

Jeśli ktoś ma bardziej precyzyjne rozwiązanie tego problemu, prosimy o udostępnienie go.

Tak, tu jest kompletny kod Adapter „s, które mogą być używane z ListView wewnątrz PopupWindow która setFocusable(false):

prywatny klasa CustomAdapter rozciąga 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; 
} 

}

+0

to wygląda na lepszą odpowiedź, gdy masz do czynienia z klawiaturą. ! –

+0

Cieszę się, że to pomogło! Rozważ głosowanie w górę, jeśli uważasz, że ta odpowiedź jest pomocna, aby inni mogli również osiągnąć to rozwiązanie. –

+0

To jest odpowiedź, aby pozostać "setFocusble (false)"! – wangqi060934

Powiązane problemy