2009-11-12 18 views
7

Codifiqué un Adaptador propio y lo agregué a mi ListActivity a través de un ListView. La razón por la que escribí un Adaptador propio es que tuve que hacer algunos cambios de diseño en las entradas de la lista. En cada entrada de la lista, tengo 3 TextViews.Android, Custom ListAdapter get TextView-Text

<?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="?android:attr/listPreferredItemHeight" 
android:padding="6dip"> 
<TextView 
    android:id="@+id/myNr" 
    android:layout_width="40dip" 
    android:layout_height="fill_parent" 
    android:layout_marginRight="15dip" 
    android:text="id" 
    android:textSize="25dip" 
    android:background="#333333" 
    android:gravity="center_horizontal"/> 
<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="0dip" 
    android:layout_weight="1" 
    android:layout_height="fill_parent"> 
    <TextView 
     android:id="@+id/editor" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:gravity="center_vertical" 
     android:text="Editor: " /> 
    <TextView 
     android:id="@+id/date" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:singleLine="true" 
     android:ellipsize="marquee" 
     android:text="Date: " /> 
</LinearLayout> 

La siguiente cosa que hice, fue implementar un "onListItemClick-Methode". Después he implementado un onListItemLongClick - Listener con el siguiente código:

en onCreate de la Actividad he añadido:

registerForContextMenu(getListView()); 

Luego añade el siguiente méthode:

Override 
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo){ 
     AdapterView.AdapterContextMenuInfo info; 
     info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
      long id = getListAdapter().getItemId(info.position); 
     } 

donde "id" es el índice del artículo en la lista. Ahora queremos obtener el texto de la texview con el id = "myNr de este ListItem. ¿Hay alguna manera de conseguir este texto?

Respuesta

6

Hola chicos he encontrado otra manera de establecer una ItemLongClickListener. Por lo tanto, también encontré una forma de obtener el texto que estoy mostrando.

ListView lv = getListView(); 
lv.setOnItemLongClickListener(new OnItemLongClickListener(){ 
@Override 
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) { 
    String[] tmp = (String[]) arg0.getItemAtPosition(row); 
    //tmp[0] ist the Text of the first TextView displayed by the clicked ListItem 
    return true; 
    }}); 
18

view es el elemento de la lista, por lo que puede hacer

String s =(String) ((TextView) view.findViewById(R.id.myNr)).getText(); 
+0

Tan simple y funciona. Gracias. :) –

0

Sí, también lo pensé, pero cuando implemento esto, obtengo el Texto del primer TextView en la Lista. Eso significa que puedo obtener el texto de la TextView deseada, pero siempre es el texto de la primera entrada de lista . ¿No hay una opción para acceder a la entrada longClickedList?

2

Si está buscando TextView en la posi ción del elemento de la persona presionado largo, lo puede conseguir utilizando algo como esto:

String s = ((TextView) view.getItemAtPosition(info.position)).getText(); 
0

gracias por su ayuda, pero me temo que todavía no funciona. si añado la línea que usted sugiere, que subraya "getItemAtPosition" y dice: --La método getItemAtPosition (int) no está definido para el tipo juicio-

Sugiere para echar la vista a una AdapterView, por lo que mira el siguiente:

String s = ((TextView) ((AdapterView<ListAdapter>) view).getItemAtPosition(info.position)).getText(); 

Cuando corro esto y hacer un clic largo sobre el tema, que recibo un "ClassCastException"

0

En este método, obtendrá el artículo relacionado con su elemento de la lista.

@Override 
public boolean onContextItemSelected(MenuItem aItem) { 
    AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); 
    Object entity = (Object) todoList.getAdapter().getItem(menuInfo.position); 
    switch (aItem.getItemId()) {} 
} 
9

acaba de tomar referencia de la vista del texto si se extiende un BaseAdapter como

Listener = new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 

TextView tx =(TextView)view.findViewById(R.id.text); 
      String s = tx.getText().toString(); 
      Log.d(TAG, "string : "+s); 
0
list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
      String title = (String) ((TextView)view.findViewById(R.id.title)).getText(); 
       String artist=(String)((TextView)view.findViewById(R.id.artist)).getText(); 

        //System.out.println(s); 
         Toast.makeText(CustomizedListView.this,"Title = "+title+"\n"+"Artist = "+artist, Toast.LENGTH_SHORT).show();        

     } 
    });  
4

he encontrado ninguna de las soluciones anteriores para trabajar.Como alternativa puede:

getListView().setOnItemLongClickListener(new OnItemLongClickListener() 
{ 

    public boolean onItemLongClick(AdapterView<?> arg0, View v,int position, long id) 
    { 

    Cursor c = (Cursor) arg0.getItemAtPosition(position); 
    String tableValue = c.getString(1); 

     return true; 
    } 
}); 
0

que tenía un ArrayList de ArrayLists como mi fuente de datos para el CustomAdapter, así que uso

menu.setHeaderTitle(Messages.get(info.position).getUserName()); 
0

usando HashMap

getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      HashMap m = (HashMap) getListView().getItemAtPosition(position); 
      System.out.println("itemClick: position = " + position + ", id = " + id + " o = " + m.get("YOUR_KEY")); 
     } 
    }); 
3

La mejor La solución que encontré fue:

@Override 
     public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, view, menuInfo); 
     AdapterView.AdapterContextMenuInfo info =  (AdapterView.AdapterContextMenuInfo)menuInfo; 

     ViewGroup vg = (ViewGroup) view; 
     View children = vg.getChildAt(info.position); 
     TextView child = (TextView) children.findViewById(R.id.text1); 

     String s= child.getText().toString(); 
      menu.setHeaderTitle(s); 
      menu.add(0, view.getId(), 0, "Serve"); 
      menu.add(0, view.getId(), 0, "View"); 

     } 
Cuestiones relacionadas