2

我试图在一个中显示蓝牙设备列表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();
    }
    ...
}
4

2 回答 2

10

改变 的行为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不存在)。

于 2015-11-17T00:00:51.743 回答
3

尝试这样的事情:(注意:我还没有尝试过。)

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();
  }

}
于 2013-07-23T19:16:02.333 回答