Android:自定义ArrayAdapter用于不同的自定义对象

时间:2013-12-16 09:42:15

标签: java android android-listview android-arrayadapter

我有许多彼此显着不同的自定义对象。这些对象存储在不同的列表中,并显示在不同的ListView中。由于这些ListView的设计,我需要创建自己的自定义ArrayAdapter。问题是,无论列表中的对象如何,ListView设计对于所有ListView都应该是相同的。

为了实现这一点,我为每种类型的对象创建了一个ArrayAdapter。例如。对于自定义对象coA我做了一个ArrayAdapter coAAdapter,而对于自定义对象coB我做了一个ArrayAdapter coBAdapter。这似乎对我来说是非常不必要的,因为除了自定义适配器扩展的ArrayAdapter及其构造函数之外,这些适配器之间几乎没有区别:

CoA类的适配器:

public class CoAAdapter extends ArrayAdapter<CoA> {
     public CoAAdapter (Context context, int resource, List<CoA> objects) {...}
}

CoB类适配器:

public class CoBAdapter extends ArrayAdapter<CoB> {
     public CoBAdapter (Context context, int resource, List<CoB> objects) {...}
}

这是应该如何使用自定义ArrayAdapter,还是有办法使这个设计更简单,比如为所有自定义对象设置一个自定义ArrayAdapter?

我考虑过一些不同的解决方案,比如创建一个通用的自定义适配器或通过为我的自定义对象创建一个公共基类来使用继承,但经过一些研究,这些都不是一个好方法。

3 个答案:

答案 0 :(得分:3)

您可以像这样定义适配器:

 public class MyArrayAdapter<T> extends ArrayAdapter<T> 
 {
      HashMap<T, Integer> mIdMap = new HashMap<T, Integer>();

      public MyArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
        super(context, textViewResourceId, objects);
        for (int i = 0; i < objects.size(); ++i) {
          mIdMap.put(objects.get(i), i);
        }
      }
  }

答案 1 :(得分:0)

您可能想要使用BaseAdapter。在该适配器的getView()中,检查对象的instanceof,做相应的事情。

答案 2 :(得分:0)

public interace SomeInterface
{
    public String getString();
}

public class classA implements SomeInterface
{
    ...

    @Override
    public String getString()
    {
        return "blabla";
    }
}

public class classB implements SomeInterface
{
    ...

    @Override
    public String getString()
    {
        return "whatever";
    }
}

public class InterfaceAdapter extends ArrayAdapter<SomeInterface> 
{
     public InterfaceAdapter (Context context, int resource, List<SomeInterface> objects) {...}
}