Разное расположение элементов в списке - PullRequest
1 голос
/ 20 октября 2011

У меня есть расширенный адаптер курсора, ведь я вызываю super с контекстом и расположением ресурсов для элемента в списке, что-то вроде этого.

вызов super в моем адаптере:

super(activity, viewResource, c, false);

создание моего адаптера:

new MyCursorAdapter(this, null, R.layout.my_list_item, null);

То, чего я хочу достичь, - это что-то вроде моего глупого макета, сделанного в краске.Проще говоря, я хочу иметь разные виды макетов для элементов, например, я хочу, чтобы все четные элементы имели layout1, а все нечетные - layout2.Пока что я могу дать только один макет в этом случае R.layout.my_list_item.Можно ли динамически менять макет?Можно ли сконструировать адаптер, чтобы иметь предметы с разным макетом?Моя цель - динамически выбрать макет предмета.Я не хочу иметь только один макет для всех элементов, которые я хочу иметь для примера два ...

Спасибо

enter image description here

Ответы [ 3 ]

2 голосов
/ 20 октября 2011

Да, вам придется сделать две вещи, хотя. Во-первых, переопределите метод getItemViewType() в вашем адаптере, чтобы вы могли быть уверены, что ваш bindView() получает только те представления, которые соответствуют определенной позиции в списке, например:

public int getItemViewType(int position){
  if(correspondsToViewType1(position)){
    return VIEW_TYPE_1;
  }
  else(correspondsToViewType2(position)){
    return VIEW_TYPE_2;
  }
  //and so on and so forth.
}

После того, как вы это сделаете, просто выполните в вашем bindView() простой тест, который проверяет, какой тип просмотра должен быть получен, и соответственно настраивает параметры следующим образом:

public void bindView(View view, Context context, Cursor cursor){
  if(correspondsToViewType1(cursor)){
    //Now we know view is of a particular type and we can do the 
    //setup for it
  }
  else if(correspondsToViewType2(cursor){
    //Now we know view is of a different type and we can do the 
    //setup for it
  }
}

Обратите внимание, что вам понадобятся разные методы для correpondsToViewType, один из которых принимает курсор, а другой - int (для позиции). Реализация этого будет зависеть от того, что вы хотите сделать.

Обратите внимание, что выполнение этих действий позволит вам повторно использовать потенциально переработанные представления. Если вы этого не сделаете, ваше приложение получит огромный удар по производительности. Прокрутка будет супер изменчивой.

0 голосов
/ 20 октября 2011

Просто переопределите метод newView:

public class MyCursorAdapter extends CursorAdapter {

private final LayoutInflater inflater;
    private ContentType type;

public MyCursorAdapter (Context context, Cursor c) {
    super(context, c);
    inflater = LayoutInflater.from(context);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    if( cursor.getString(cursor.getColumnIndex("type")).equals("type1") ) {
                // get elements for type1
    } else {
                // get elements for type1
            }

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {

    if( cursor.getString(cursor.getColumnIndex("type")).equals("type1") ) {
        final View view = inflater.inflate(R.layout.item_type1, parent, false);
    } else {
        final View view = inflater.inflate(R.layout.item_type2, parent, false);
    }
    return view;
}
0 голосов
/ 20 октября 2011

Я предполагаю, что ваш расширение SimpleCursorAdapter от имени вашего пользовательского адаптера. Вы захотите переопределить функцию getView в своем адаптере и в зависимости от объекта в списке надувать другой макет и вернуть это представление.

EX:

     @Override
     public View getView (int position, View convertView, ViewGroup parent)
     {
            Object myObject = myList.get(position);

            if(convertView == null)
            {
                  if( something to determine layout )
                        convertView = inflater.inflate(Layout File);
                  else
                        convertView = inflater.inflate(Some Other Layout File);
            }

            //Set up the view here, such as setting textview text and such

            return convertView;
     }

Это всего лишь пример и несколько sudo-кода, поэтому он потребует некоторых настроек для вашей конкретной ситуации.

...