ListView用法简单学习
来源:互联网 发布:java的发展方向 编辑:程序博客网 时间:2024/06/07 13:01
写了几篇博客,感觉效果还可以,但是想换个方式。之前写的像流水账,感觉首先题目就不好,都是一个题目加个序号让人不知道内容是什么,其次是每一篇着重研究一个知识点就可以,内容更加有针对性。所以从这一片开始换一种写法。
我们的目标是建立一个条目可以滚动的程序。需要使用ListView,大致分为四步:
1.建立子项(条目)类
2.制作子项布局
3.建立适配器类
4.在活动中调用适配器与布局
1.建立子项(条目)类
定义一个实体类,作为ListView适配器的适配类型。例如新建类Fruit,代码如下:
package com.example.listview;public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId) { this.name = name; this.imageId = imageId; } public String getName() { return name; } public int getImageId() { return imageId; }}
可知:我们把子项抽象成了一个类,在这个类中有子项的多有内容,并且还提供了子项的构造方法以及获取子项内容的方法,图片内容返回的是id。
2.下面应该位子项创建布局:
这里我们的子项有两项内容,一个是水果名称String name,另一个是水果的图片,所以每一个子项布局应该有一个TextView,和一个ImageView。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dip" /></LinearLayout>
3.创建一个自定义适配器
这个适配器需要继承ArrayAdapter,并且将泛型指定为子项的类,在这里既是Fruit类。所以新建适配器类FruitAdapter:
package com.example.listview;import java.util.List;import com.example.listview.Fruit;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;public class FruitAdapter extends ArrayAdapter<Fruit> { private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) { super(context, textViewResourceId, objects); resourceId = textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); //View view = LayoutInflater.from(getContext()).inflate(resourceId, null); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, null); viewHolder = new ViewHolder(); viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image); viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } /* ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName()); */ viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); return view; } class ViewHolder { ImageView fruitImage; TextView fruitName; }}
类中,首先申明了一个resourceId变量用来储存资源文件的Id,重写了构造方法,传入三个参数,分别是是下文,资源文件Id与子项的类的实例,构造函数首先调用父类的构造方法,然后将资源Id赋值给resourceId。
同时,适配器类还提供了一个getView方法,在自定义时应当重写。getView方法就是用来显示被滚动到屏幕可见区域的子项(当然了显示才能看见,明白意思就好),这个函数需要向内传递三个参数,分别是int position表示item的第几条从0开始,View convertView就是item上的布局layout或者组件的旧视图,ViewGroup parent是此视图最终会被附加到的父级视图。
具体到这个项目之中,首先声明一个Fruit类的实例fruit引用,并用getItem方法进行获取所在位置的实例赋给fruit。
之后,想要载入界面。对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;对于一个已经载入的界面,就可以使用Activity.findViewById()方法来获得其中的界面元素。
我们想要获得View的实例,先要获得LayoutInflater实例:
1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 2. LayoutInflater inflater = LayoutInflater.from(context); 3. LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
这三种方法其实是一样的,本质是都是调用的Context.getSystemService()。
之后再调用inflate方法,inflate方法有多种方法重载,详情看这里,这里一般使用如下:
LayoutInflater.from(getContext()).inflate(resourceId, null);
传入两个参数,分别是资源Id与null,关于参数可以看这里
这样就获得了了当前子项的View实例。
下一步,我们子项各个内容的实例,使用上一步所获得的view实例,调用它的findViewById方法进行获取view对象并进行向下转型,在这里我们获得ImageView与TextView实例各一个。
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName());
最后我们把资源或者资源Id赋给获得的View子类对象。、
4.在活动中调用适配器以显示ListView布局
首先生命一个List泛型为子项类:
private List<Fruit> fruitList = new ArrayList<Fruit>();
该List是一个ArrayList,之后写一个初始化子项类与列表的函数:
private void initFruits() { Fruit apple = new Fruit("Apple", R.drawable.apple_pic); fruitList.add(apple); Fruit banana = new Fruit("Banana", R.drawable.banana_pic); fruitList.add(banana); Fruit orange = new Fruit("Orange", R.drawable.orange_pic); fruitList.add(orange); Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic); fruitList.add(watermelon); Fruit pear = new Fruit("Pear", R.drawable.pear_pic); fruitList.add(pear); Fruit grape = new Fruit("Grape", R.drawable.grape_pic); fruitList.add(grape); Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic); fruitList.add(pineapple); Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic); fruitList.add(strawberry); Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic); fruitList.add(cherry); Fruit mango = new Fruit("Mango", R.drawable.mango_pic); fruitList.add(mango); }
这样每个子项都可以初始化完成也都加载进List,在onCreate方法中调用此方法以初始化。并且声明并建立一个FruitAdapter的对象adapter:
initFruits(); FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
可以看出,构造方法中传递的是本类地对象,每个子项的布局文件,以及子项类的集合。
再然后,创建一个列表布局对象,传入参数为列表布局文件,最后使用setAdapter方法将将适配器与列表布局对象进行适配;
ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter);
至此,运行程序,一个可以滚动的列表就生成了。
- ListView用法简单学习
- listview的简单用法
- listView的简单用法
- listView的简单用法
- ListView的简单用法
- ListView的简单用法
- ListView的简单用法
- listview的简单用法
- 【Android】安卓学习笔记之ListView的简单用法
- android-ListView的简单用法
- listview和treeview的简单用法
- listview和treeview的简单用法
- c#中ListView的简单用法
- c# winform listview控件简单用法
- ListView 与 SimpleAdapter的简单用法
- c# ListView的网格简单用法
- 【Android】浅谈ListView的简单用法
- 【Android】41、ListView控件的简单用法
- Android Intent传值
- java并发编程:join用法
- Codeforces Round #365 (Div. 2) Problem D.Mishka and Interesting sum 解题报告
- hdu 5762 Teacher Bo(暴力美学)
- sign 签名验证
- ListView用法简单学习
- codeforces 703C Chris and Road
- echars 自定义触发鼠标悬停事件
- css基础重要几点
- AMC-ICPC Live Archive 7295 和 CSU 1715
- 大数加法
- Java中的对象流总结
- OJ系统上线——OJ.BoilTask.com
- ESP8266开发中的流水账