2011-11-25 23 views
6

Tengo una aplicación con pestañas. En una pestaña, necesito poner datos (cadenas) en filas. Para hacerlo, elegí tableLayout, pero cuando quise usar un contextmenu en sus filas, no funciona.Android cómo usar el adaptador para listView sin extender listActivity

Puedo mostrar el contextmenuonLongClick pero el problema es que no puedo obtener la información sobre la fila seleccionada para editar o eliminar la fila seleccionada. Luego leo en una discusión que usar listView es mejor que tablelayout si tenemos muchas filas. Pero los ejemplos que vi extienden listactivity pero no quiero hacer esto.

Así que cuando intento trabajando en un listView sin extender listactivity no sé cómo hacerlo lo que quiero decir es que nunca he utilizado listView antes, así que intento diferentes ejemplos que encontré en el Internet para entenderlo, pero no funciona. Esto es lo que he hecho hasta ahora para el listView:

String [] items=getRessources().getStringArray(R.arra.resolution); 
//Resolution is an array of strings 
ListView lv=(ListeView) findViewById(R.id.listView); 
v.setAdapter(new ArrayAdapter<string>(this, android.R.layout.simple_list_item_1, items); 

Cuando compilo me sale una lista con los elementos de mi matriz en ella, pero en primer lugar, quiero cambiar el color del texto, que no puedo. Y en segundo lugar, quiero agregar filas dinámicamente a la lista, que tampoco sé cómo hacer. Creo que tengo que usar un adapter para hacerlo, pero no sé cómo. ¿Puede alguien guiarme por esto? Sólo quiero saber cómo conectar mi lista a un adapter which'll permítanme añadir dinámicamente filas, etc. añadir contextMenu

+0

¿Por qué no desea ampliar ListActivity? – kaspermoerch

+0

@KasperMoerch en realidad soy nuevo en el desarrollo de Android y ya estoy teniendo problemas con algunos elementos, pensé que crearía más dificultades. – Anila

+0

Si usa 'TabActivity', cada' Tab' contendrá 'Activity'. Si la 'Actividad' que contiene la lista que menciona tiene este como su propósito principal, sería mucho más fácil extender' ListActivity'. Si no quiere hacer eso, debe implementar su propio 'Adaptador' personalizado para lograr la funcionalidad mencionada (tendrá que hacer esto de todos modos, si desea poder agregar elementos a la lista en el mosca). – kaspermoerch

Respuesta

6

principal Clase de actividad:

import java.util.ArrayList; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.Button; 
import android.widget.ListView; 

public class SelectedActivity extends Activity { 

private SelectedAdapter selectedAdapter; 
private ArrayList<String> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.selected_example); 

    // populate the model - a simple a list 
    list = new ArrayList<String>(); 
    list.add("Apple"); 
    list.add("Orange"); 
    list.add("Grape"); 
    list.add("Grape1"); 
    list.add("Grape2"); 
    list.add("Grape3"); 
    list.add("Grape4"); 
    list.add("Grape5"); 
    list.add("Grape6"); 

    // create our SelectedAdapter 
    selectedAdapter = new SelectedAdapter(this,0,list); 
    selectedAdapter.setNotifyOnChange(true); 

    ListView listview = (ListView) findViewById(R.id.listExample); 
    listview.setAdapter(selectedAdapter); 

    listview.setOnItemClickListener(new OnItemClickListener() { 
     //@Override 
     public void onItemClick(AdapterView arg0, View view, 
             int position, long id) { 
      // user clicked a list item, make it "selected" 
      selectedAdapter.setSelectedPosition(position); 
     } 
    }); 
} 

clase de adaptador:

import java.util.List; 
    import android.content.Context; 
    import android.graphics.Color; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ArrayAdapter; 
    import android.widget.Button; 
    import android.widget.TextView; 

    public class SelectedAdapter extends ArrayAdapter{ 

     // used to keep selected position in ListView 
     private int selectedPos = -1; // init value for not-selected 

     public SelectedAdapter(Context context, int textViewResourceId, 
         List objects) { 
      super(context, textViewResourceId, objects); 
     } 
     public void setSelectedPosition(int pos){ 
     selectedPos = pos; 
      // inform the view of this change 
      notifyDataSetChanged(); 
     } 
     public int getSelectedPosition(){ 
      return selectedPos; 
     } 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View v = convertView; 
       // only inflate the view if it's null 
       // if (v == null) { 
         LayoutInflater vi = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
         v = vi.inflate(R.layout.selected_row, null); 
       // } 

       // get text view 
        TextView label = (TextView)v.findViewById(R.id.txtExample); 
        Button btn=(Button)v.findViewById(R.id.btn1); 

        // change the row color based on selected state 
        if(selectedPos == position){ 
         label.setBackgroundColor(Color.CYAN); 
         btn.setBackgroundResource(R.drawable.next); 
        } 
        else{ 
         label.setBackgroundColor(Color.WHITE); 
        } 

        label.setText(this.getItem(position).toString());  
        return(v); 
     } 
} 
+0

Muchas gracias por la respuesta, solo una pregunta a qué se refiere selected_Row en vi.inflate (R.layout.selected_row, null). – Anila

+0

La misma pregunta para el ejemplo_eleccionado. ¿Son estos los diseños que has creado? En caso afirmativo, ¿qué contienen? – Anila

+0

Ok, creé dos diseños: uno con listView y el otro con el botón y testView y no obtuve errores de compilación, pero no ocurre nada cuando hago clic en una fila. : s – Anila

0

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bg8" 
    android:id="@+id/RootView" 
    > 
     <LinearLayout android:id="@+id/myLayout" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent"> 
     </LinearLayout> 

</LinearLayout> 

es necesario definir un xml que se utilizará para almacenar los datos de cada fila:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:weightSum="1"> 

    <TableRow 
     android:id="@+id/tableRow1" 
     android:layout_width="793dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.23" > 

     <TextView android:id="@+id/col1" 
      android:layout_height="fill_parent" 
      android:layout_width="wrap_content" 
      android:width="50dp" 
      android:textSize="18sp" 

     /> 
     <TextView android:id="@+id/col2" 
      android:layout_height="fill_parent" 
      android:layout_width="wrap_content" 
      android:width="150dp" 
      android:textSize="18sp" 
     /> 
     <ImageView android:id="@+id/editimage" 
      android:background="@drawable/edit" 
      android:clickable="true" 
      android:onClick="ClickHandlerForEditImage" 
      android:layout_width="35dp" 
     android:layout_height="35dp"/> 

    </TableRow> 

</LinearLayout> 

en el XML anterior también he incluido la ImageView, no es realmente necesario, pero esto es sólo para modificar sus que podemos incluir los otros controles también.

& en el último usted debe tener una función en su clase relacionada:

private void LoadData() 
{ 

    DBAdapter db = new DBAdapter(this); 
    db.open(); 
    Cursor cur = db.GetData(); 
    private ListView lv = (ListView)findViewById(R.id.myLayout); 
    lv.setAdapter(null); 
    if(cur.moveToFirst()) 
    { 
      String[] from = new String[] {"_id","column1"}; 
      int[] to = new int[] {R.id.col1, R.id.col2}; 
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.grid_item, cur, from, to); 
      lv.setAdapter(adapter); 

    } 
     db.close(); 
     } 
} 
0

Parece que nadie le ha respondido a la pregunta contextMenu. Para obtener un menú contextual para trabajar con su lista, después de llamar ListView yourList = getListView(); debe llamar registerForContextMenu(yourList);

Y para manejar la creación de menús debe implementar el método

@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ 
super.onCreateContextMenu(context, v,menuInfo); 
MenuInflater inflater = getMenuInflater(); 
menu.setHeaderTitle("YOUR TITLE"); 
menu.setHeaderIcon(R.drawable.YOUR DRAWABLE); 
inflater.inflate(R.menu.YOUR_MENU_RESOURCE, menu); 
} 

A continuación, puede responder a clics por implenting la método

@Override public boolean onContextItemSelected(MenuItem item){ 
switch(item.getItemId()){ 
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected 
return true; 
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected 
return true; 
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected 
return true; 
} 
return false; // nothing selected 
} 
Cuestiones relacionadas