5

Desidero creare un cursore del cursore personalizzato molto semplice per facilitare la modifica dei colori degli elementi di riga al clic. Utilizzando il seguente codiceCreazione dell'adattatore del cursore semplice personalizzato

private static int save = -1; 

public void onListItemClick(ListView parent, View v, int position, long id) { 

    parent.getChildAt(position).setBackgroundColor(Color.BLUE); 

    if (save != -1 && save != position){ 
     parent.getChildAt(save).setBackgroundColor(Color.BLACK); 
    } 

    save = position;     

} 

ho ricevuto il codice da questa discussione https://stackoverflow.com/a/7649880/498449

avrei usato un adattatore cursore semplice e collocato il codice nella onClick, ma perché l'elenco predefinito nella ListFragment riutilizza vista, mentre scorri più viste, viene mostrato che sono evidenziate. Parlando su IRC, è stato suggerito di creare un adattatore del cursore personalizzato. Tuttavia, non riesco a trovare la migliore pratica su come farlo e su dove si inserisca lo snippet di codice sopra. Potrei apprezzare molto l'aiuto.

public class AreaCursorAdapter extends CursorAdapter { 
    private Context context; 


    public AreaCursorAdapter(Context context, Cursor c) { 
     super(context, c); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView list_item = (TextView)view.findViewById(android.R.id.text1); 
    list_item.setText(cursor.getString(cursor.getColumnIndex(INDICATOR_NAME))); 

} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false); 
    bindView(v, context, cursor); 
    return v; 
} 

} 

Ho aggiornato l'adattatore del cursore con un codice che ho trovato online. Tuttavia, ho due problemi. 1. Sto usando un caricatore di cursori, quindi non ho un oggetto "cursore" da passare nel costruttore. 2. Ricevo un avviso da Eclipse che il costruttore è stato deprecato.

+0

in NewView si crea una visualizzazione con LayoutInflater.inflate, in Bindview si imposta il contenuto e lo sfondo in base alla selezione int, in onclick si sono finite cambia la selezione int e comunica all'adattatore che è stata apportata una modifica al suo contenuto. – zapl

+0

@zapl potresti mostrare uno snippet di codice. Inoltre, sto implementando questo usando un caricatore di cursori, quindi non ho un oggetto "cursore" da passare al costruttore. –

+0

Al momento non ho uno snippet :(probabilmente Google ha. Con i caricatori fare 'adapter.swapCursor()' in 'onLoadFinished'. – zapl

risposta

18

Si dovrebbe essere in grado di farlo su in questo modo:

class YourListFragment extends ListFragmentOrSomethingElse { 
    private AreaCursorAdapter mAdapter; 

    @Override  
    public void onCreate() { 
     mAdapter = new AreaCursorAdapter(this, null); 
     setListAdapter(mAdapter); 
    } 

    @Override 
    public void onListItemClick(ListView parent, View v, int position, long id) { 
     mAdapter.setSelectedPosition(position); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     mAdapter.swapCursor(cursor); 
     // should reset that here maybe 
     mAdapter.setSelectedPosition(-1); 
    } 
} 

public class AreaCursorAdapter extends CursorAdapter { 
    private Context context; 
    private int mSelectedPosition; 
    LayoutInflater mInflater; 

    public AreaCursorAdapter(Context context, Cursor c) { 
     // that constructor should be used with loaders. 
     super(context, c, 0); 
     mInflater = LayoutInflater.from(context); 
    } 

    public void setSelectedPosition(int position) { 
     mSelectedPosition = position; 
     // something has changed. 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     TextView list_item = (TextView)view.findViewById(android.R.id.text1); 
     list_item.setText(cursor.getString(cursor.getColumnIndex(INDICATOR_NAME))); 
     int position = cursor.getPosition(); // that should be the same position 
     if (mSelectedPosition == position) { 
      view.setBackgroundColor(Color.RED); 
     } else { 
      view.setBackgroundColor(Color.WHITE); 
     } 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false); 
     // edit: no need to call bindView here. That's done automatically 
     return v; 
    } 

} 
+0

Sei un risparmiatore di vita! farlo funzionare con il codice di cui sopra. –

+0

dove posso interrogare il provider in listfragment? – nia

+0

@nia Si userebbe un 'CursorLoader'. La query è all'interno di' onCreateLoader' (non mostrato nel codice sopra) vedi http://helpmeco.de/2012/3/using-an-android-cursor-loader-with-a-content-provider per esempio – zapl

Problemi correlati