最近项目里面需要弹出列表供选择,从服务器上面拿到数据解析到的是对象,因为有其它属性,而显示选择的时候只是一个文本,就想到用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;
}
}
}
效果图: