Пользовательский адаптер ListView для разных строк

1

Я использую ListView для отображения некоторых данных JSON и хочу отображать каждый результат в соответствии с его типом (Artist, Release, Label...).

Я буду использовать интерфейс, реализуемый каждым типом результата:

public interface Result {
    public Int getId();
    public String getThumb();
    // ...
} 

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

  • создание enum ResultType в interace (поэтому унаследованный класс должен возвращать свое собственное значение, такое как ResultType.ARTIST в getType()
  • проверка типа экземпляра с использованием isInstance()

Я хотел бы знать, что было бы лучшим способом выполнить что-то, что эквивалентно этому C-коду (массив указателя функции), поскольку я бы хотел избежать использования многих операторов if/else.

typedef struct s_func {
   const char *type_name;
   void* (*func_pointer)(void *result_infos);
} t_func;

static t_func type_array[] = {
 {"artist", artist_function},
 {"label", label_function},
  // ....
 {NULL, NULL}
}

void check_type(const char *type_string)
{
  int i, j = 0;
  char *key_value;

  // compare string and array key
  while (type_array && type_array[i][0]) {
    key_value = type_array[i][0];
    // if key match
    if (type_string && strncmp(type_string, key_value, strlen(type_string)) == 0) {
       type_array[i][1](); // call appropriate function;
    }
    i++;    
  }
}

Я предполагаю, что это будет использовать HashMap но (может быть, я ошибаюсь), похоже, у него нет переписной нотации. Есть ли простой способ построить HashMap пар?

спасибо

Теги:

1 ответ

0

Я думаю, вы можете использовать ArrayAdapter. Взгляните на этот учебник, чтобы понять, что я имею в виду.

Это потребует некоторого поворота, чтобы он мог иметь дело с различными видами предметов. Сделать интерфейс MyListItem

public interface MyListItem {
    public int getLayout();
    public void bindToView(View v);
}

Сделайте разные макеты для отображения Artist, Release, Label. Сделайте классы Artist, Release, Label, которые реализуют MyListItem.

public class Artist implements MyListItem {
    private String Name;

    public Artist(String name){
        this.name = name;
    }

    public int getLayout() {
        return R.layout.artistlayout;
    }

    public void bindToView(View v) {
        TextView textView = (TextView) rowView.findViewById(R.id.artistLabel);
        textView.setText(name);
    }
}

Теперь адаптер должен только вызвать правильные методы, чтобы заполнить представление для выбранного элемента.

public class MySimpleArrayAdapter extends ArrayAdapter<MyListItem> {
  private final Context context;
  private final MyListItem[] values;

  public MySimpleArrayAdapter(Context context, MyListItem[] values) {
    super(context, android.R.layout.simple_list_item_1, values);
    this.context = context;
    this.values = values;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    MyListItem item = values[position];

    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(item.getLayout(), parent, false);
    item.bindTo(view);
    return view;
  }
}
  • 0
    Вы не сможете повторно использовать представления для быстрой и быстрой прокрутки длинных списков. Если это необходимо, возможно, лучше создать один макет, который будет отображать их все и привязывать каждый тип к одному и тому же макету.
  • 0
    Теперь я вижу, что другие далеко впереди меня: stackoverflow.com/questions/4777272/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню