在实际应用中常常需要用到自定义的适配器来显示视图比如qq好友列表等等,

对于这样的视图需求我们可以简单分析下所需要的内容。首先这个界面需要一个ListView。而每一个item需要有ImageView,TextView。而这需要适配器来关联item。
首先需要listView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/user_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#eeeeee"
android:dividerHeight="10dp">
ListView>
LinearLayout>
对于要显示的内容需要封装一个类User
public class User {
private int icon;
private String nick;
private String sign;
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public User(int icon, String nick, String sign) {
this.icon = icon;
this.nick = nick;
this.sign = sign;
}
}
接下来就是自定义适配器了,这个adapter需要继承自BaseAdapter
public class UserAdapter extends BaseAdapter {
private List list ;
private LayoutInflater mInflater;
public UserAdapter(Context context , List list){
this.list = list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list == null?0:list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position ;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = mInflater.inflate(R.layout.item_user_layout,null);
ImageView ivIcon = layout.findViewById(R.id.item_icon);
TextView tvNick = layout.findViewById(R.id.item_nick);
TextView tvSign = layout.findViewById(R.id.item_sign);
User u = list.get(position);
ivIcon.setImageResource(u.getIcon());
tvNick.setText(u.getNick());
tvSign.setText(u.getSign());
return layout;
}
}
#### 对于item显示需要用到对应的布局,尤其是需要使用布局加载器 LayoutInflater来加载对应的布局```
"http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
"@+id/item_icon"
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@drawable/i1"/>
"@+id/item_nick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/item_icon"
android:text="ABC"
android:textSize="20sp"
android:layout_marginLeft="5dp"
/>
"@+id/item_sign"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/item_icon"
android:layout_alignLeft="@id/item_nick"
android:text="ABC"
android:textSize="20sp"
android:maxLines="3"
android:ellipsize="end"
/>
当所有的东西准备好之后我们就需要在MainActivity内去加载这些数据了,特别是需要数据源
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView userList = findViewById(R.id.user_list);
List list = new ArrayList<>(13);
***
int resId1 = getResources().getIdentifier("i1","drawable","com.xykj.zdyadapter");***
User u1 = new User(resId1,"轩辕","即黄帝(公元前2717年-公元前2599年):古华夏部落联盟首领,中国远古时代华夏民族的共主。五帝之首。被尊为中华“人文初祖”。据说他是少典与附宝之子,本姓公孙,后改姬姓,故称姬轩辕。居轩辕之丘,号轩辕氏,建都于有熊,亦称有熊氏。也有人称之为“帝鸿氏”。");
list.add(u1);
int resId2 = getResources().getIdentifier("i2","drawable","com.xykj.zdyadapter");
User u2 = new User(resId2,"端木","端木姓为汉字复姓。端木此姓相当的古老,自东周时期便有此姓,据元和姓纂记载,端木一姓的祖宗为孔子弟子端木赐(即子贡),系出于卫国。端木姓分布相当的广,但后来大多改姓为端姓、木姓、沐姓,故今日已不多见。");
list.add(u2);
int resId3 = getResources().getIdentifier("i3","drawable","com.xykj.zdyadapter");
User u3 = new User(resId3,"司马","司马(sī mǎ):西晋国姓,中华姓氏之一,复姓。源于西周,以官职为姓。西周始置,司马与司徒、司空并称“三有司”。在宋版《百家姓》中排序为第四百一十位。");
list.add(u3);
int resId4 = getResources().getIdentifier("i4","drawable","com.xykj.zdyadapter");
User u4 = new User(resId4,"上官","上官姓在中国的大陆和台湾省都没有列入百家姓前三百位,在宋版《百家姓》中排序为第四百一十一位,新姓氏人口排序第510位,约有7.5万余人。");
list.add(u4);
int resId5 = getResources().getIdentifier("i5","drawable","com.xykj.zdyadapter");
User u5 = new User(resId5,"欧阳","欧阳姓,中华姓氏之一,为汉族复姓之首。据2014年统计,欧阳姓为324万。在中国排86位。");
list.add(u5);
int resId6 = getResources().getIdentifier("i6","drawable","com.xykj.zdyadapter");
User u6 = new User(resId6,"慕容","慕容姓《三国志·鲜卑传》中提到,汉桓帝时,鲜卑分为中、东、西三部,中部大夫柯最阙,居慕容寺。而从《通志·氏族略》的记载上考究,慕容氏出自中古时期,部族首领高辛氏的后裔,建立鲜卑国,自言慕二仪(天地)之道,继三光(日、月、星)之容,因此以慕容为姓,称为慕容氏。历史上的鲜卑族在今内蒙西拉木伦河与洮儿河之间。慕容氏的发源地和老家便在这里。");
list.add(u6);
int resId7 = getResources().getIdentifier("i7","drawable","com.xykj.zdyadapter");
User u7 = new User(resId7,"司空","司空是中国古代官名。西周始置,位次三公,与六卿相当,与司马、司寇、司士、司徒并称五官,掌水利、营建之事,金文皆作司工。春秋、战国时沿置。是周代掌管当时代表最先进科学技术水平的工部的手工业制造官员。汉朝本无此官,成帝时改御史大夫为大司空,但职掌与周代的司空不同。司空亦为中国姓氏之一。");
list.add(u7);
int resId8 = getResources().getIdentifier("i8","drawable","com.xykj.zdyadapter");
User u8 = new User(resId8,"东皇","东皇太一是《九歌》体系中所祭祀的天帝、至高神。“东皇太一”与汉武帝祭祀的至高神“太一神”、汉代之后的文献里记载的“泰一”、“泰皇”、“泰壹氏”等,均有关。");
list.add(u8);
int resId9 = getResources().getIdentifier("i9","drawable","com.xykj.zdyadapter");
User u9 = new User(resId9,"刑天","是中国古代神话传说人物之一,和黄帝争位。据《山海经·海外西经》当中记载:“ 刑天与帝至此争神,帝断其首,葬之於常羊之山,乃以乳为目,以脐为口,操干戚以舞。");
list.add(u9);
int resId10 = getResources().getIdentifier("i10","drawable","com.xykj.zdyadapter");
User u10 = new User(resId10,"蚩尤","蚩尤,是上古时代九黎氏族部落联盟的首领,骁勇善战,相传蚩尤是牛图腾和鸟图腾氏族的首领,有说是和炎帝同属一个部落。他有兄弟八十一人,个个本领非凡。");
list.add(u10);
int resId11 = getResources().getIdentifier("i11","drawable","com.xykj.zdyadapter");
User u11 = new User(resId11,"应龙","应龙是古代中国神话传说中一种有翼的龙,又名飞龙,亦作黄龙,另有学者推测应龙以庚辰为名;本居于天,曾作为黄帝大将斩杀蚩尤、夸父,曾以尾画地成江,助大禹治水,擒获无支祁。");
list.add(u11);
int resId12 = getResources().getIdentifier("i12","drawable","com.xykj.zdyadapter");
User u12 = new User(resId12,"李牧","李牧是战国末年东方六国最杰出的将领。 [1] 深得士兵和人民的爱戴,有着崇高的威望。在一系列的作战中,他屡次重创敌军而未尝败,显示了高超的军事指挥艺术。");
list.add(u12);
int resId13 = getResources().getIdentifier("i13","drawable","com.xykj.zdyadapter");
User u13 = new User(resId13,"白起","白起是继中国历史上自孙武、吴起之后又一个杰出的军事家、统帅,《千字文》将他与廉颇、李牧、王翦并称为战国四大名将,位列战国四大名将之首。");
list.add(u13);
UserAdapter adapter = new UserAdapter(MainActivity.this,list);
userList.setAdapter(adapter);
}
}
需要注意的是这种显示的姓名以及简介都是不一样的内容,因此不建议使用数组进行封装。到此所有的数据都已经被组装完毕,可以看看运行效果

需要注意的是文本显示的内容根据个人喜好可以自行设定,当显示的内容较多时ListView会自带滚动条效果而不需要自己再去创建一个滚动条。
如果想实现qq好友一样的列表用这个方法还不够,这个以后再讨论。