Я использую 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
пар?
спасибо
Я думаю, вы можете использовать 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;
}
}