Как объединить адаптер и представление в MergeAdapter - PullRequest
0 голосов
/ 25 августа 2011

Я довольно новичок в Android и у меня возникли проблемы с пониманием использования cwac-MergeAdapter.

Я пытаюсь использовать MergeAdapter для заполнения счетчика; мой экземпляр MergeAdapter должен включать в себя SimpleCursorAdapter, который правильно считывает данные из моей базы данных, и (как нижний колонтитул) новый TextView (или Button), который должен быть активным.

В настоящее время, если я добавлю спиннер в mergeAdapter, содержащий только данные из БД, все работает как чудо; однако, когда я добавляю новый вид, я получаю только одну пустую запись во всем блесне. Может кто-нибудь помочь мне с этим?

Здесь следует код:

essenceItems = new SimpleCursorAdapter(this, R.layout.db_row_view,
    essenceCursor, from, to);

    TextView addEssence = new TextView(getApplicationContext());
    addEssence.setTextColor(R.color.red);
    addEssence.setText("Add new item...");
    addEssence.setWidth(ViewGroup.LayoutParams.FILL_PARENT);
    addEssence.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
    addEssence.setOnClickListener(new OnClickListener() {

       public void onClick(View v) {
         startActivityForResult(new Intent(v.getContext(),
         EssencePopup.class), ADD_ESSENCE);

     }
     });
    ma = new MergeAdapter();
    ma.addAdapter(essenceItems);
    ma.addView(addEssence, true);
    spinner.setAdapter(ma);

1 Ответ

2 голосов
/ 25 августа 2011

Маловероятно, что я когда-либо поддержу добавление отдельного Views в MergeAdapter, который будет использоваться в Spinner.Это означало бы, что я каким-то образом знаю, как создать раскрывающийся список View для некоторого произвольного View.

Обходной путь, который я имею для вас, заключается в том, чтобы вы добавили следующее к своему форку MergeAdapter:

public View getDropDownView(int position, View convertView, ViewGroup parent) {
  for (ListAdapter piece : pieces) {
    int size = piece.getCount();

    if (position < size) {
      return (((SpinnerAdapter)piece).getDropDownView(position, convertView, parent));
    }

    position -= size;
  }

return (null);
}

Затем, вместо добавления индивидуума View через addView(), добавьте свой собственный ArrayAdapter для дополнительных данных.Обязательно вызовите setDropDownViewResource() на всех ваших адаптерах внутри MergeAdapter - ваш пример кода никогда не вызывал этого, что вызывало некоторые другие ваши трудности (например, «некоторые записи в счетчике пустые»).

Возможно, я объединю это изменение с MergeAdapter или, возможно, создам с ним подкласс SpinnerMergeAdapter.Слепой бросок на SpinnerAdapter пугает меня, поэтому я хочу обдумать это немного больше.При легком тестировании приведенный выше код работает нормально.


Кроме того, удалите все вхождений getApplicationContext() из своего кода, заменив его на this илиWhateverYourActivityNameIs.this в зависимости от ситуации. Только используйте getApplicationContext(), когда вы знаете , почему вы используете getApplicationContext().

...