ListView的用法

ListView的用法

ListView是android中最常用也是最难用的控件。它允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,原有数据滚动到屏幕外。

目录:


流程图:

Created with Raphaël 2.1.0 开始 在布局中加入ListView控件 定义一个实体类,作为适配器的适配类型 为ListView的子项指定布局 创建一个自定义的适配器 修改MainActivty.java中的代码,进行初始化 结束

在布局中加入ListView控件

在activity_main.xml中添加如下代码:

<ListView
    android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

定义一个实体类,作为适配器的适配类型

新建一个类,eg:Color,仅定义了两个字段,需要时可以修改和添加,代码如下:

代码块

public class Color{
    private String name;
    private int imageId;
    public Color(String name,int imageId){
        this.name=name;
        this.imageId=imageId;
    }
    public String getName(){
        return name;
    }
    public int getImageId(){
        return imageId;
    }
}

为ListView的子项指定布局

在layout目录下新建color_item.xml,代码如下:

代码块

<Imageview
    android:id="@+id/color_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<TextView
    android:id="@+id/color_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginLeft="10dp"/>

创建一个自定义的适配器

这个适配器继承自ArrayAdapter,并将泛型指定Color类。新建类ColorAdapter,代码如下:

代码块

public class ColorAdapter extends ArrayAdapter<Color> {
    private int resourceId;
    public FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects){
        //重写了构造函数,用于将上下文、ListView子项布局的id和数据都传递进来
        super(context,textViewResourceId,objects);
        resourceId=textViewResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        /*//不用convertView时的用法,运行效率低,因为ListView在快速滚动时,会多次调用将布局重新加载
        Color color=getItem(position);
        View view= LayoutInflater.from(getContext()).inflate(resourceId,null);
        ImageView colorImage=(ImageView)view.findViewById(R.id.color_image);
        TextView colorName=(TextView)view.findViewById(R.id.color_name);
        colorImage.setImageResource(color.getImageId());
        colorName.setText(color.getName());
        return view;*/

        //改进版
        Color color=getItem(position);//得到当前项的Color实例
        View view;
        //用于对控件实例进行缓存
        ViewHolder viewHolder;
        if(convertView==null){
            //为这个子项加载传入的布局
        view=LayoutInflater.from(getContext()).inflate(resourceId,null);
            viewHolder=new ViewHolder();
            //获取到ImageView和TextView实例
            viewHolder.colorImage=(ImageView)view.findViewById(R.id.color_image);
            viewHolder.colorName=(TextView)view.findViewById(R.id.color_name);
            //将viewHolder存储在view当中
            view.setTag(viewHolder);
        }else{
        //直接调出之前加载好的布局并显示
            view=convertView;
            viewHolder=(ViewHolder) view.getTag();
        }
        viewHolder.colorImage.setImageResource(color.getImageId());
        viewHolder.colorName.setText(color.getName());
        return view;
    }
    class ViewHolder{
        ImageView colorImage;
        TextView colorName;
    }
}

修改MainActivty.java中的代码,进行初始化

代码块

public class MainActivity extends AppCompatActivity {

    private List<Color> colorList =new ArrayList<Color>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initColors();
        ColorAdapter adapter=new ColorAdapter(MainActivity.this,R.layout.color_item,colorList);
        ListView listView=(ListView) findViewById(R.id.listview);
        listView.setAdapter(adapter);
        //创建点击事件,点击哪一项就以Toast形式显示颜色的名称
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Color color=colorList.get(i);
                Toast.makeText(MainActivity.this,color.getName(),Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void initcolors(){
        Color black=new Color("black",R.drawable.black);
        colorList.add(black);
        Color white=new Color("white",R.drawable.white);
        colorList.add(white);
        Color red=new Color("red",R.drawable.red);
        colorList.add(red);
        //补充示例
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值