2012-06-28 20 views
13

Sto tentando di mostrare una ListView da una finestra popup. ma quando provo a chiamare il setOnItemClickListener di ListView niente èapartito. Qui Si Giava il filesetOnItemClickListener di ListView per Android non chiamato

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

     } 
    }); 
} 

}

Eccolo primo file 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> 

Qui gonfiare file xml main.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> 

Che cosa sto facendo di sbagliato?

Grazie

+0

può provare ListView.setAdapter (nuovo ArrayAdapter (MyBannerActivity.this,? invece di getApplicationContext(), –

+0

@ Dheeresh Singh: così com'è. Non succede nulla – Mansi

+0

L'evento per il clic del pulsante funziona ma listlist non è in grado di fare clic su listner – rajpara

risposta

39

Solo un piccolo cambiamento nel codice e il codice BOOOM ti ascolterà elenco evento

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

si dimentica di citare attivabile impostazione vero in PopupWindow costruttore.

+1

Oh, giusto, ovviamente Android Perché dovrei mai presumere che un PopupWindow non sia focalizzabile di default come ogni altra vista che ho usato.Amico sono un tale idiota a volte .. – samosaris

0

maggio questo aiuterà .

Dichiarare listview ed elencare onClickListener al di fuori del pulsante ClickListener.

5

ha avuto lo stesso problema, ma nel mio caso è stato richiesto setFocusble(false) (e l'utilizzo ListPopupWindow non era una soluzione nel mio caso come un sacco di roba nel progetto funzionalità PopupWindow di base già in uso l' compresa l'estensione).

Se qualcuno nella stessa situazione v'è una sorta di soluzione basata su bug discusson here (post # 9)

L'idea principale è quella gerarchia ListView s' è ancora riceve eventi touch in modo che possiamo attivare manualmente onItemClick() .

Tuttavia, questo approccio non è identico al 100% alla manipolazione del tocco reale di ListView (come se non vi fosse alcun bagliore di selezione mentre si toccava una riga) questo per me è stato abbastanza buono per il momento.

Se qualcuno ha una soluzione più precisa di questo problema, si prega di condividere.

Così, qui è completo di codice d' Adapter che può essere utilizzato con ListView all'interno PopupWindow che è setFocusable(false):

classe privata CustomAdapter estende 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

questa sembra la risposta migliore ogni volta che hai a che fare con una tastiera. Grazie per questa idea ! –

+0

Sono contento! Considerate il voto in su se pensate che questa risposta sia utile, così che altri possano raggiungere anche questa soluzione –

+0

Questa è la risposta a rimanere "setFocusble (false)"! – wangqi060934

Problemi correlati