【问题标题】:Displaying custom objects in ArrayAdapter - the easy way?在 ArrayAdapter 中显示自定义对象 - 简单的方法?
【发布时间】:2013-07-23 19:09:00
【问题描述】:

我正在尝试在ArrayAdapter 中显示蓝牙设备列表,并希望覆盖适配器的默认功能以显示对象toString()。我知道有扩展 getView(...) 方法的解决方案,但我真的觉得这太复杂了。我想要的只是覆盖要显示的字符串的构建方式。对于蓝牙设备,这将使用getName() 而不是toString()

所以我创建了一个如下所示的自定义数组适配器,并且理想情况下有一个类似于 getDisplayString(T value) 的方法

public class MyArrayAdapter extends ArrayAdapter<BluetoothDevice> {
    ...
    @Override //I wish something like this existed
    protected String getDisplayString(BluetoothDevice b) {
        return b.getName();
    }
    ...
}

【问题讨论】:

    标签: android android-arrayadapter


    【解决方案1】:

    改变getView 的行为不必那么复杂。

    mAdapter = new ArrayAdapter<MyType>(this, R.layout.listitem, new ArrayList<MyType>()) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView view = (TextView) super.getView(position, convertView, parent);
            // Replace text with my own
            view.setText(getItem(position).getName());
            return view;
        }
    };
    

    这样做的缺点是在上面设置了两次视图文本(一次在super.getView 中,一次在覆盖中),但这不会花费太多。如果convertView 不存在,另一种方法是使用inflater 自己创建视图。

    【讨论】:

    • 经过多次寻找,我找到了最简单的解决方案,而且效果很好!话虽如此,ListView 不允许您设置显示字段名称是否有原因?我想知道
    • 可能是因为他们真的希望您提供具有自定义 .toString() 行为的对象。在这里,您可以使用自己的类包装 BluetoothDevice 并使 toString 做任何您想做的事情。不过我同意你的 OP,拥有一个可覆盖的 getDisplayString 方法会更容易。
    【解决方案2】:

    试试这样的:(注意:我没试过。)

    public class MyArrayAdapter extends ArrayAdapter<Object> {
      public MyArrayAdapter(Context c, List<Object> data){
       super(c, 0, data);
       mData = data;
    
     }
     @Override
     public Object getItem(int position){
        return ((BluetoothDevice)mData.get(position)).getName();
      }
    
    }
    

    【讨论】:

    • 这样做我不能使用 arrayAdapter 作为蓝牙设备的容器...
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多