5

Я хочу создать очень простой пользовательский адаптер курсора, чтобы облегчить изменение цвета элементов строки при щелчке. Используя следующий кодСоздание пользовательского простого адаптера курсора

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;     

} 

Я получил код из этого потока https://stackoverflow.com/a/7649880/498449

я бы использовал простой адаптер курсора и поместил код в OnClick, а потому, что список по умолчанию в ListFragment повторно представление, как вы просматриваете несколько видов, будут выделены. Говоря о IRC, было предложено создать пользовательский адаптер курсора. Тем не менее, я не могу найти наилучшую практику, как это сделать, и где будет помещен фрагмент кода. Может быть очень благодарен за помощь.

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

} 

Я обновил адаптер курсора кодом, который я нашел в Интернете. Однако у меня две проблемы. 1. Я использую загрузчик курсора, поэтому у меня нет объекта «курсора», который нужно передать в конструктор. 2. Я получаю предупреждение от Eclipse о том, что конструктор устарел.

+0

в NewView создании вида с LayoutInflater.inflate, в BindView установить содержание и фона в соответствии с выбранным междунар в OnClick вы этого нужно просто измените выбор int и сообщите адаптеру, что произошла смена его содержимого. – zapl

+0

@zapl вы можете показать фрагмент кода. Кроме того, я реализую это с помощью курсора-загрузчика, поэтому у меня нет объекта «курсора» для перехода к конструктору. –

+0

У меня нет фрагмента прямо сейчас :(Возможно, у google есть. С загрузчиками do 'adapter.swapCursor()' в 'onLoadFinished'. – zapl

ответ

18

Вы должны быть в состоянии сделать это о том, как:

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

Вы спасатель жизни! получить его для работы с указанным выше кодом. –

+0

где я запрашиваю у провайдера в listfragment? – nia

+0

@nia Это будет использовать 'CursorLoader'. Запрос находится внутри' onCreateLoader' (не показанный в приведенном выше коде) см. http://helpmeco.de/2012/3/using-an-android-cursor-loader-with-a-content-provider например – zapl

Смежные вопросы