首页 > 系统 > Android > 正文

Android控件之ListView

2019-11-06 09:48:47
字体:
来源:转载
供稿:网友

现在我们的项目要求是制作一个图片和文本共存的ListView,效果图如下 这里写图片描述

首先我们创建一个新的工程,在MainActivty的布局文件中添加ListView控件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.studio.listviewdemo.MainActivity"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView></LinearLayout>

根据项目需求,我们要为这种左图片右文本的ListView写一个提供给其适配器的布局文件fruits_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <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_vertical" android:layout_marginLeft="10dp"/></LinearLayout>

可见ListView每一项都是一种水果,因此可以为其创建一个实体类Fruits

package com.studio.listviewdemo;/** * Created by xwx on 2017/2/27. */public class Fruits{ PRivate String name;//水果名称 private int imageId;//水果图片资源id public Fruits(String name,int imageId) { this.imageId=imageId; this.name=name; } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public String getName() { return name; } public void setName(String name) { this.name = name; }}

由于我们的数据是无法直接显示在ListView上的,因此我们需要一个适配器,在这里选用ArrayAdapter,它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入,我们在这里创建一个自定义适配器FruitAdapter继承ArrayAdapter<Fruits>,指定泛型为Fruits

package com.studio.listviewdemo;import android.content.Context;import android.support.annotation.NonNull;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;import static com.studio.listviewdemo.R.id.fruit_name;/** * 自定义适配器 */public class FruitAdapter extends ArrayAdapter<Fruits>{ private int resourceId;//适配器子布局资源id //三大参数:上下文,子布局资源ID,数据源 public FruitAdapter(Context context, int resource, List<Fruits> objects) { super(context, resource, objects); resourceId=resource; } /** * 在每个子项被滚动到屏幕内的时候会被调用来为每一个子项加载布局视图 */ @NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { //得到当前项的Fruits实例 Fruits fruits=getItem(position); //声明控件实例缓存类 ViewHolder viewHolder; //为这个子项加载我们传入的布局,其中convertView用于将之前加载好的布局view进行缓存,以便之后的重用 //如果convertView为null说明是第一次加载布局,那么就使用LayoutInflater去加载布局,如果不为null就直接调用上一次缓存的布局convertView即可 //如果是第一次加载布局,就用findViewById获取控件,缓存到ViewHolder中,并将ViewHolder存在view中;如果不是第一次获取控件,则直接从view中取出ViewHolder,防止每次为子项加载布局都要用findViewById获取控件 View view; if(convertView==null) { view=LayoutInflater.from(getContext()).inflate(R.layout.fruit_item,parent,false); viewHolder=new ViewHolder(); viewHolder.fruitImage= (ImageView) view.findViewById(R.id.fruit_image); viewHolder.fruitName= (TextView) view.findViewById(R.id.fruit_name); viewHolder.fruitImage.setImageResource(fruits.getImageId()); viewHolder.fruitName.setText(fruits.getName().toString()); view.setTag(viewHolder); } else { view = convertView; viewHolder= (ViewHolder) view.getTag(); viewHolder.fruitImage.setImageResource(fruits.getImageId()); viewHolder.fruitName.setText(fruits.getName().toString()); } return view; } //创建一个控件实例缓存内部类用于优化性能 class ViewHolder { ImageView fruitImage; TextView fruitName; }}

经过上面的代码,我们不仅完成了适配器类的创建还对其加载布局的流程进行了优化。现在我们回到MainActivity。

package com.studio.listviewdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity{ /*创建存放适配器包含数据的集合,即数据源*/ private List<Fruits> fruitsList=new ArrayList<Fruits>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ListView listView= (ListView) findViewById(R.id.list_view); initFruits(); /*注意适配器的泛型是Fruits,那么其构造函数中数据源的类型就是存放Fruits对象的集合而不是Fruits对象*/ FruitAdapter fruitAdapter=new FruitAdapter(this,R.layout.fruit_item,fruitsList); listView.setAdapter(fruitAdapter); /*为ListView添加点击事件,position参数就是子项的标号(从0开始)*/ listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruits fruits=fruitsList.get(position); Toast.makeText(MainActivity.this,fruits.getName().toString(),Toast.LENGTH_SHORT).show(); } }); } private void initFruits() { Fruits fruits=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits); Fruits fruits1=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits1); Fruits fruits2=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits2); Fruits fruits3=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits3); Fruits fruits4=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits4); Fruits fruits5=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits5); Fruits fruits6=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits6); Fruits fruits7=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits7); Fruits fruits8=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits8); Fruits fruits9=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits9); Fruits fruits10=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits10); Fruits fruits11=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits11); Fruits fruits12=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits12); Fruits fruits13=new Fruits("apple",R.mipmap.ic_launcher); fruitsList.add(fruits13); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表