ListView控件
在程序中需要大量数据的时候,可以用上下滑动的方法浏览更多的数据。
1.建立一个简单的ListView项目
首先先建立一个项目,在默认的activity_main.xml中加入ListView控件,其中对长度宽度全部设定成match_parent,让其充满整个空间。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
2.使用ArrayAdapter,通过泛型来制定要适配的数据类型,在构造函数中将要适配的函数传入。暂时使用的是字符串类型。今天同时还接触到了创建自定义的适配器,继承ArrayAdapter,并且将泛型指为新创建的类。
先新创建一个类,其中name代表名称,imageId代表所需要的图片资源的id。
package com.example.listviewtest;
/**
* Created by hp on 2018/4/17.
*/
public class People {
private String name;
private int imageId;
public People(String name,int imageId){
this.name = name;
this.imageId = imageId;
}
public String getName(){
return name;
}
public int getImageId(){
return imageId;
}
}
然后创建一个新的适配器,继承ArrayAdapter,命名为FruitAdapter,代码如下:
其中的粉色字体是用来提升ListView的运行效率,在getView()的方法中还有一个convertView参数,这个参数是用于将之前加载好的页面布局进行缓存,以便以后使用
如果是convertView为null就需要去加载布局,如果不是的话,直接使用。
package com.example.listviewtest;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by hp on 2018/4/17.
*/
public class FruitAdapter extends ArrayAdapter<People>{
//项布局id
private int resourceId;
//将上下文,ListView的子项布局的id和数据传递进来
public FruitAdapter(Context context, int textViewResourceId, List<People> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
//重写getView的方法
public View getView(int posotion,View convertView, ViewGroup parent){
People people = getItem(posotion);//获取当前的People的实例项
//View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
View view;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
}else{
view = convertView;
}
ImageView fruitImage = (ImageView) view.findViewById(R.id.list_view1);
TextView fruitName = (TextView) view.findViewById(R.id.people_name);
fruitImage.setImageResource(people.getImageId());
fruitName.setText(people.getName());
return view;
}
}
根据网上的解释(侵权删)
这是一段很典型的适配器代码实例,我们一行一行来看。
//定义适配器名字,并继承ArrayAdapter类,指定泛型为Fruit
public class FruitAdapter extends ArrayAdapter<Fruit> {
//定义资源Id
private int resourceId;
//构造函数,指定了三个参数
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
//表示重写父类方法
super(context, textViewResourceId, objects);
//把传入的资源Id赋值给resourceId
resourceId = textViewResourceId;
}
//重写getView方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获得传入的对象,getItem是ArrayAdapter中的方法,就是返回传入集合中的对象
Fruit fruit = getItem(position);
//根据传入的资源id解析布局文件
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
//获得该布局文件下的ImageView
ImageView fImage = (ImageView) view.findViewById(R.id.fruit_image);
//获得该布局文件下的TextView
TextView fname = (TextView) view.findViewById(R.id.fruit_name);
//设置图片
fImage.setImageResource(fruit.getImageId());
//设置名称
fname.setText(fruit.getName());
//返回该视图
return view;
}
}
3.根据上方的方法就可以调用setImageResource()和setText()方法来获取需要显示的图片和文字
package com.example.listviewtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<People> peopleList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initPeoples();
FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,peopleList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
private void initPeoples(){
for(int i = 0;i<20;i++){
People one = new People("-----------------",R.drawable.timg_3);
peopleList.add(one);
}
}
}
对创建简单的适配器有一点心得,要知道其中的数据代表着什么,对已经重复使用的代码做到熟悉,看见能看懂的地步。
适配器现在在我这里的理解就是连接数据和页面的一个中转站,把数据传入方法,在页面需要的时候调用。