Java 不同行的ListView自定义适配器

Java 不同行的ListView自定义适配器,java,android,c,Java,Android,C,我使用ListView来显示一些JSON数据,并希望根据其类型(艺术家、发布、标签…)显示每个结果 我将使用每种结果类型实现的接口: public interface Result { public Int getId(); public String getThumb(); // ... } 我想知道这些选择中哪一个是最好的解决方案(我对更好的事情持开放态度,这正是我脑子里想的): 在区间中创建enum ResultType(因此继承的类必须在getType()方

我使用ListView来显示一些JSON数据,并希望根据其类型(艺术家、发布、标签…)显示每个结果

我将使用每种结果类型实现的接口:

public interface Result {
    public Int getId();
    public String getThumb();
    // ...
} 
我想知道这些选择中哪一个是最好的解决方案(我对更好的事情持开放态度,这正是我脑子里想的):

  • 在区间中创建
    enum ResultType
    (因此继承的类必须在
    getType()方法中返回自己的值,如
    ResultType.ARTIST
  • 使用
    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++;    
  }
}
我想它应该使用
哈希映射
,但是(我可能错了)它似乎没有一个简单的符号。有没有简单的方法来构建一个成对的
哈希映射


谢谢

我想你可以使用ArrayAdapter。 看看我的意思

它需要一些摆弄,以便处理不同种类的物品。 创建一个接口MyListItem

public interface MyListItem {
    public int getLayout();
    public void bindToView(View v);
}
为艺术家、发布、标签的展示制作不同的布局。 使实现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;
  }
}
公共类mysimplearlayadapter扩展了ArrayAdapter{
私人最终语境;
私有最终MyListItem[]值;
公共mySimpleArrayaAdapter(上下文上下文,MyListItem[]值){
super(context,android.R.layout.simple\u list\u item\u 1,value);
this.context=上下文;
这个值=值;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
MyListItem=值[位置];
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图=充气机。充气(item.getLayout(),父项,false);
item.bindTo(视图);
返回视图;
}
}

您将无法重复使用视图快速滚动长列表。如果需要,您可能最好制作一个布局,将所有视图显示出来,并将每种类型绑定到同一布局。我现在看到其他类型的视图远远领先于我: