摘要
ListView是Android最常用的控件之一,也是最难用的控件之一,通过对于《第一行代码》的ListView教学,自主实现了一个模拟qq好友列表,这里进行记录并讲解
首先ListView是一个列表类型的布局,其中包含着一项又一项的ListItem,例如这样:
ListView图示
但是,要注意的是,ListItem可不是那么容易就可以装入到ListView中的,就比如我们包装礼品的时候,我们需要首先在打包盒里面设置好我们放置的物品的模具,我们才能够安安稳稳地打包我们的礼品,ArrayAdapter就是我们的模具,也叫做适配器。
图示
但是适配器只有默认一种类型,就是传入一个简单的TextView,也就是只能显示一条条字符串,所以我们要实现模拟qq好友列表,要先实现自己的适配器!
实现自己的适配器之前,我们看看我们的好友列表是什么样子的
qq列表
总之呢就是一个图片+一个名字+一个签名
图片我们可以保存为R.drawable.img的形式,也就是int 类型
另外两个就是String类型。
先创建自己的一个数据结构QQ
public class QQ {
private String qqName;
private String qqText;
private int qqImageId;
public QQ(String QQName,String QQText,int QQImageId){
qqName = QQName;
qqText = QQText;
qqImageId = QQImageId;
}
public String getQqName(){
return qqName;
}
public String getQqText(){
return qqText;
}
public int getQqImageId(){
return qqImageId;
}
}
实现了简单的数据结构,并且初始化,且实现了三个返回私有数据的接口。
接下来实现我们小布局ListItem,也就是qq中一个联系人的布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/qq_image"
android:src="@drawable/ic_launcher_background"
android:layout_width="200px"
android:layout_height="200px"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"/>
<TextView
android:id="@+id/qq_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/qq_image"
android:textSize="24sp"
android:hint="qq名"/>
<TextView
android:id="@+id/qq_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/qq_name"
android:layout_alignLeft="@id/qq_name"
android:layout_marginTop="10dp"
android:hint="qq签名QQ签名QQ签名"/>
</RelativeLayout>
qqitem
qq头像我们固定成200px*200px
利用相对布局调整两个TextView的位置
调整qq名字的大小,实现简单的Item布局
接下来我们实现自定义的适配器类,继承自ArrayAdapter类,数据类型为QQ类型
public class QQAdapter extends ArrayAdapter<QQ> {
private int resourceId;
public QQAdapter(Context context, int textViewResourceId, List<QQ> objects){
super(context,textViewResourceId,objects);
resourceId = textViewResourceId;
}
构造函数传进来三个参数,第一个是上下文Context,第二个是我们的布局文件,第三个是自定义数据结构的一个列表类型,也一堆要展示的数据,然后调用父类的构造函数,并且保存当前的布局文件。
实现
getView()
函数,这个函数当我们将Item划到屏幕中心的时候即可调用,我们要动态给当前屏幕中央的Item添加布局。
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
QQ qq = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
ImageView imageView = (ImageView)view.findViewById(R.id.qq_image);
TextView nameView = (TextView)view.findViewById(R.id.qq_name);
TextView textView = (TextView)view.findViewById(R.id.qq_text);
imageView.setImageResource(qq.getQqImageId());
nameView.setText(qq.getQqName());
textView.setText(qq.getQqText());
return view;
}
调用getItem(position)获取当前屏幕中央的数据
新建布局对象,传进去布局、父布局、false设置当前布局没有父布局(意味着可以被其他布局所包含)
将当前qq的信息传入对应的布局文件,然后给当前qq返回布局
最后,我们在 MainActivity.java里面实现我们的数据初始化与显示。
public class MainActivity extends AppCompatActivity {
private List<QQ> qqList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initQQ();
QQAdapter adapter = new QQAdapter(MainActivity.this,R.layout.item_test,qqList);
ListView listView = findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
private void initQQ(){
for(int i = 0 ; i < 4 ; i++){
QQ m1 = new QQ("YAOMENGLONG" , " just do it" , R.drawable.img_1);
QQ m2 = new QQ("ChenChangLiang","i am chen sir",R.drawable.img_2);
QQ m3 = new QQ("YaoYingjie","BALABALA",R.drawable.img_3);
QQ m4 = new QQ("Bianjiaojiao","HAHAHAHAHAHAHAHAHAHA",R.drawable.img_4);
qqList.add(m1);
qqList.add(m2);
qqList.add(m3);
qqList.add(m4);
}
}
}
qqlist这里的ListView我们提前创建好了。利用initQQ初始化数据,传入我们的适配器中,最后利用listView.setAdapter(adapter)添加我们的适配器,点击运行
有好多可以调整的地方,这里主要是对使用ListView进行简单的实践,就不拘小节啦~~
网友评论