2011-11-25 9 views
6

Ho un'applicazione con schede. In una scheda ho bisogno di mettere i dati (stringhe) in righe. Per fare ciò ho scelto tableLayout ma quando volevo utilizzare uno contextmenu sulle sue righe non funzionava.Android come utilizzare l'adattatore per listView senza estendere la listaAttività

Posso mostrare il contextmenuonLongClick ma il problema è che non riesco a ottenere le informazioni sulla riga selezionata per modificare o eliminare la riga selezionata. Poi ho letto in una discussione che usare listView è meglio di tablelayout se abbiamo molte righe. Ma gli esempi che ho visto si estendono listactivity ma non voglio farlo.

Così quando provo a lavorare su un listView senza estendere listactivity non so come fare quello che voglio dire è che non ho mai usato prima listView così cerco diversi esempi che ho trovato su internet per capirlo, ma la sua non funziona. Ecco quello che ho fatto finora per il 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); 

Quando compilo io ottenere una lista con gli elementi della mia matrice in esso, ma prima, voglio cambiare il colore del testo, che non posso. E in secondo luogo voglio aggiungere righe dinamicamente alla lista che non so come fare neanche. Penso di dover usare uno adapter per farlo ma non so come. Qualcuno può aiutarmi a guidarmi attraverso questo. Voglio solo sapere come collegare la mia lista a un adapter which'll mi permetta di aggiungere dinamicamente le righe, aggiungere contextMenu ecc

+0

Perché non si desidera estendere ListActivity? – kaspermoerch

+0

@KasperMoerch in realtà sono nuovo di Android Dev e sto già avendo problemi con alcuni elementi ho pensato che avrebbe creato qualche difficoltà in più. – Anila

+0

Se stai usando un 'TabActivity', ogni' Tab' manterrà una 'Activity'. Se il 'Activity' che contiene la lista che hai citato ha questo come scopo principale, sarebbe di gran lunga più semplice estendere semplicemente' ListActivity'. Se non si desidera farlo, è necessario implementare il proprio 'Adattatore 'personalizzato per ottenere la funzionalità menzionata (sarà necessario farlo comunque, se si desidera poter aggiungere elementi all'elenco sulla volare). – kaspermoerch

risposta

6

principale Classe di attività:

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

classe Adapter:

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

Grazie mille per la risposta solo una domanda cosa fa select_Row fare riferimento a vi.inflate (R.layout.selected_row, null). – Anila

+0

Stessa domanda per selected_example. Sono questi i layout che hai creato? Se sì, cosa contengono? – Anila

+0

Ok ho creato due layout: uno con listView e l'altro con il pulsante e il testView e non ricevo errori di compilazione, ma non succede nulla quando faccio clic su una riga. :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> 

è necessario definire un xml che verrà utilizzato per contenere i dati di ogni riga:

<?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> 

Nel XML qui sopra ho incluso anche l'ImageView, non è veramente necessario, ma questo è solo per modificare i tuoi che possiamo includere anche gli altri controlli.

& all'ultimo si dovrebbe avere una funzione nella classe relativa:

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

sembra che nessuno ti ha risposto contextMenu domanda. Per ottenere un menu di scelta rapida per lavorare con la vostra lista, dopo aver chiamato ListView yourList = getListView(); è necessario chiamare registerForContextMenu(yourList);

E per gestire la creazione di menu è necessario implementare il metodo

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

Poi si può rispondere ai clic da implenting la metodo

@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 
} 
Problemi correlati