一、Listview的使用
1、ListView的使用
(1)ArrayAdapter适配器
ArrayAdapter可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。而且ArrayAdapter有多个构造函数的重载,我们可以根据实际情况选择最合适的一种。例如,我们将希望用ListView展示出来的数据放在一个String类型的数组中,具体如下所示:
String[] data={"菠萝","芒果","石榴"};
为了展示String类型的数据,我们可以创建一个String类型的适配器。具体如下所示:
ArrayAdapter<String> adapter=new ArrayAdapter<>(MainActivity.this,and
roid.R.layout.simple_list_item_1,data);
然后通过setAdapter函数将适配器加载到控件中:
listView.setAdapter(adapter);
(2)点击事件响应
在实际使用过程中,如果我们想要进一步了解ListView中某一项的内容,我们需要点击了解详情,因此,我们可以给ListView设置一个点击事件响应。具体代码如下所示:
public void onItemClick(AdapterView<?> parent, View view, int i, long
l) {
(3)结果展示
最终效果如下图所示:
2、定制ListView界面
(1)自定义适配器
由于我们在实际使用过程中希望使用一些其他的展现方式,例如图文混排,因此我们需要自定义一个适配器FruitAdapter来继承ArrayAdapter。具体代码如下所示:
FruitAdapter adapter=new FruitAdapter(MainActivity.this,R.layout.frui
t_item,fruitlist);
(2)自定义类
List泛型中既包括图片又包括文本,因此我们需要自定义一个Fruit类,并将所有我们希望展示的物品属性罗列其中。具体代码如下所示:
public class Fruit {
private int imageID;
private String name;
private String price;
}
(3)inflate方法
inflate方法用于将子容器控件嵌入到父容器控件中,该方法共有三个参数,第一个参数为自己设计的子容器布局,第二个参数为父容器控件布局,第三个布尔参数值表明是否连接该布局和其父容器控件,在这里情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一个ViewGroup。具体代码如下所示:
inflate(R.layout.fruit_item,parent,false)
(4)提升ListView运行效率
目前ListView的运行效率较低,以为在FruitAdapter类的getView方法中,每次都将布局重新加载了一遍,在快速滚动的时候,这将会成为性能的瓶颈,若数据列表中存在大量数据,运行时可能会出现加载时间过长等一系列问题。因此,我们需要使用convertView参数,用于将之前加载好的布局进行缓存,以便之后可以进行使用。具体代码如下所示:
public View getView(int position, @Nullable View convertView, @No
nNull ViewGroup parent) {
除了通过convertView参数来进行缓存,我们还可以通过新增内部类ViewHolder来对控件实例进行缓存。内部类ViewHolder如下所示:
private class ViewHolder {
ImageView fruitimage;
TextView fruitname;
TextView fruitprice;
}
当convertView参数值为nulll时,创建一个ViewHolder对象:
if (convertView==null){
viewHolder=new ViewHolder();
}
并将控件的实例都存放在ViewHolder中,然后调用View的setTag方法,将对象存储在View中。具体代码如下所示:
view.setTag(viewHolder);
如果convetView不为null,则调用View的getTag方法将ViewHolder重新取出,具体代码如下所示:
else {
view=convertView;
viewHolder= (ViewHolder) view.getTag();//重新获取 viewHolder
}
(5)运行结果展示
2、RecyclerView的使用
RecyclerView提供了三种布局管理器,即LinearLayoutManager线性布局管理器、StaggeredGridLayoutManager瀑布流管理器、GridLayoutManager网格布局管理器,这三种布局管理器都是通过setLayoutManager方法来设置的。
(1)LinearLayoutManager线性布局管理器
LinearLayoutManager可以设置横向滚动和纵向滚动,只需通过setOrientation函数设置滚动方向即可。纵向滚动代码如下所示:
layoutManager .setOrientation(RecyclerView.VERTICAL);
运行结果如下所示:
横向滚动代码如下所示:
layoutManager .setOrientation(RecyclerView.HORIZONTAL);
运行结果如下所示:
(2)网格布局管理器GridLayoutManager
我们可以通过GridLayoutManager方法中的第二个参数设置网格的列数,第三个参数设置网格 排列方向:RecyclerView.HORIZONTAL表示横向排列,Recycler.VERTICAL表示纵向排列。具体代码如下所示:
GridLayoutManager layoutManager = new GridLayoutManager(this, 5 ,Recycl
erView.HORIZONTAL,false);
运行效果图如下所示:
(4)StaggeredGridLayoutManager瀑布流布局
我们可以通过StaggeredGridLayoutManager方法中的第一个参数来设置瀑布流的列数,通过第二个参数来设置瀑布流的滑动方向:StaggeredGridLayoutManager.VERTICAL表示纵向滚动,StaggeredGridLayoutManager.HORIZONTAL表示横向滚动。具体代码如下所示:
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutMan
ager( 3 ,StaggeredGridLayoutManager.VERTICAL);
运行效果如下所示: