5

Deseo crear un adaptador de cursor personalizado muy simple para facilitar el cambio de colores de los elementos de fila al hacer clic. Usando el siguiente códigoCreación de un adaptador de cursor simple personalizado

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;     

} 

me dieron el código de este hilo https://stackoverflow.com/a/7649880/498449

habría utilizado un adaptador de cursor simple y coloca el código en el onclick, pero debido a la lista por defecto en el ListFragment reutiliza puntos de vista, a medida que desplazas varias vistas, se muestran resaltadas. Hablando sobre IRC, se sugirió que crease un adaptador de cursor personalizado. Sin embargo, parece que no puedo encontrar la mejor práctica sobre cómo hacerlo y dónde cabría el fragmento de código anterior. Podría agradecer enormemente la ayuda.

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

} 

He actualizado el adaptador del cursor con algún código que encontré en línea. Sin embargo, tengo dos problemas. 1. Estoy usando un cargador de cursor, por lo que no tengo un objeto "cursor" para pasar al constructor. 2. Recibo una advertencia de Eclipse de que el constructor ha quedado obsoleto.

+0

en NewView se crea una vista con LayoutInflater.inflate, en Bindview se establece el contenido y el fondo de acuerdo a su int selección, en onclick que jsut cambie la selección int e indique al adaptador que ha habido un cambio en su contenido. – zapl

+0

@zapl podría mostrar un fragmento de código. Además, estoy implementando esto usando un cargador de cursor, por lo que no tengo un objeto "cursor" para pasar al constructor. –

+0

No tengo un fragmento en este momento :(google probablemente tiene. Con cargadores do 'adapter.swapCursor()' en 'onLoadFinished'. – zapl

Respuesta

18

Usted debe ser capaz de hacerlo de esa manera:

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

¡Usted es un salvavidas! hacer que funcione con el código anterior. –

+0

¿dónde puedo consultar al proveedor en listfragment? – nia

+0

@nia Eso estaría usando un 'CursorLoader'. La consulta está dentro de' onCreateLoader' (no se muestra en el código anterior) vea http://helpmeco.de/2012/3/using-an-android-cursor-loader-with-a-content-provider por ejemplo – zapl

Cuestiones relacionadas