2012-06-28 13 views
13

Estoy tratando de mostrar un ListView desde un PopupWindow. pero cuando intento llamar a setOnItemClickListener de ListView, no hay nada que hacer. Es aquí Java ArchiveAndroid ListView's setOnItemClickListener de PopupWindow no se llama

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

     } 
    }); 
} 

}

aquí es primer archivo 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> 

Aquí se infle archivo 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> 

¿Qué estoy haciendo mal?

Gracias

+0

puede tratar de lista.setAdapter (nuevo ArrayAdapter (MyBannerActivity.this,? en lugar de getApplicationContext(), –

+0

@ Dheeresh Singh: como está, no ocurre nada – Mansi

+0

El evento de clic de botón funciona, pero el elemento listview no hace clic en listner no funciona – rajpara

Respuesta

39

Sólo un pequeño cambio en el código y el código de BOOM va a escuchar a usted lista, haga clic en evento

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

Se olvida mencionar enfocable establecer cierto en PopupWindow constructor.

+1

Oh, claro, claro, Android ¿Por qué iba a suponer que una ventana emergente no sería enfocable por defecto como en cualquier otra vista que utilicé? Hombre soy tan tonto a veces. – samosaris

0
Mayo

que esto ayudará a .

Declare listview y liste onClickListener fuera del botón ClickListener.

5

tenían el mismo problema, pero en mi caso se requería setFocusble(false) (y utilizando ListPopupWindow no era una solución en mi caso como un montón de cosas en el proyecto funcionalidad ya utilizados PopupWindow de base 's incluyendo la extensión).

Si alguien en la misma situación existe un tipo de solución basada en bug discusson here (post # 9)

La idea principal es que la jerarquía ListView 's sigue siendo recibe eventos de toque por lo que pueden desencadenar manualmente onItemClick() .

Sin embargo, este enfoque no es 100% idéntico al manejo táctil real de ListView (como que no hay brillo de selección al tocar una fila), esto me fue muy bien por el momento.

Si alguien tiene una solución más precisa de este problema, por favor, comparta.

lo tanto, aquí es código completo Adapter 's que se puede utilizar con ListView dentro PopupWindow que es setFocusable(false):

CustomAdapter clase privada se extiende 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

esto parece ser la mejor respuesta cuando se trata de un teclado. Gracias por esta idea ! –

+0

¡Me alegro de que haya sido útil! Considere la posibilidad de votar si cree que esta respuesta es útil para que otros también puedan llegar a esta solución –

+0

¡Esta es la respuesta para seguir siendo "setFocusble (false)"! – wangqi060934