ArrayAdapter使用对象直接显示

最近项目里面需要弹出列表供选择,从服务器上面拿到数据解析到的是对象,因为有其它属性,而显示选择的时候只是一个文本,就想到用ArrayAdapter来显示。但是用ArrayAdapter的话难道我先去把对象列表转成String列表?后面发现ArrayAdapter的构造函数传的是泛型,并不是List类型,这不是说List也可以?不多想,直接看源码
先找都getView

public View getView(int position, View convertView, ViewGroup parent) {
    return createViewFromResource(mInflater, position, convertView, parent, mResource);
}

发现调用的是createViewFromResource,再找到这个方法

private View createViewFromResource(LayoutInflater inflater, int position, View convertView,
        ViewGroup parent, int resource) {
    View view;
    TextView text;

    if (convertView == null) {
        view = inflater.inflate(resource, parent, false);
    } else {
        view = convertView;
    }

    try {
        if (mFieldId == 0) {
            //  If no custom field is assigned, assume the whole resource is a TextView
            text = (TextView) view;
        } else {
            //  Otherwise, find the TextView field within the layout
            text = (TextView) view.findViewById(mFieldId);
        }
    } catch (ClassCastException e) {
        Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
        throw new IllegalStateException(
                "ArrayAdapter requires the resource ID to be a TextView", e);
    }

    T item = getItem(position);
    if (item instanceof CharSequence) {
        text.setText((CharSequence)item);
    } else {
        text.setText(item.toString());
    }

    return view;
}

关键代码来了

if (item instanceof CharSequence) {
    text.setText((CharSequence)item);
} else {
    text.setText(item.toString());
}

调用的是对象的item.toString(),那么我们重写这个方法不就好了吗。不多说,上demo代码

public class MainActivity extends AppCompatActivity {
private ListView list1,list2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    list1 = (ListView)findViewById(R.id.list1);
    list2 = (ListView)findViewById(R.id.list2);

    List<String> strings = new ArrayList<>();
    for (int i = 0;i<10;i++){
        strings.add("这是第 " + i + " 项!");
    }
    list1.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,strings));

    List<Bean> beanList = new ArrayList<>();
    for (int i = 0;i<10;i++){
        Bean bean = new Bean();
        bean.setName("这是第 " + i + " 项!");
        bean.setCard("123454656778");
        bean.setType("1");
        beanList.add(bean);
    }
    list2.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,beanList));
}

class Bean {
    private String name;
    private String card;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCard() {
        return card;
    }

    public void setCard(String card) {
        this.card = card;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return name;
    }
}

}

效果图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值