前面我们已经了解到了Listview的最基本用法,是不是觉得只是展示单纯的文字信息比较单调,那我们现在就马上来看listview使用之,自定义适配器,使用这个以后,就可以展示各种各样的数据啦。
先看效果
第一步 新建一个类 继承BaseAdapter 可以看到必须实现四个方法 下面来一一解释
第一个 getCount方法 返回整个list里面数据的个数
第二个getItem方法 返回没一个Item的数据
第三个 getItemId方法 返回每个Item的id
第四个,是最重要的方法getView方法 绘制视图 调用次数由第一个方法决定 返回每个视图
我现在的数据是一张图片和一个字符串
所以 需要一个对象来保存没一个视图的数据
下面是对象类
public class Bean { private String name; private int resid; public Bean(String name, int resid) { this.name = name; this.resid = resid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getResid() { return resid; } public void setResid(int resid) { this.resid = resid; }
下面是适配器类
package comiptv.example.vincent.listview; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by liliu on 2016/8/25. */ public class MyAdapter extends BaseAdapter{ private LayoutInflater mInflater; List<Bean> list; public MyAdapter(Context context,List<Bean> list) { mInflater=LayoutInflater.from(context);//得到一个LayoutInfalter对象用来导入布局 this.list=list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = mInflater.inflate(R.layout.my_listview_item, null);//通过mInflater来加载布局 ImageView iv = (ImageView) convertView.findViewById(R.id.iv);//找到对应的控件 TextView tv = (TextView) convertView.findViewById(R.id.tv); iv.setImageResource(list.get(position).getResid());//根据position下标来设置控件的内容 tv.setText(list.get(position).getName()); return convertView; } }
我们需要使用自定义的适配器需要创建数据源,在这里仍然使用本地数据
下面是MainActivity
public class MainActivity extends AppCompatActivity { private ListView lv; List<Bean> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); list=new ArrayList<>();//存储对象的集合 int [] resids={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4,R.mipmap.a5, R.mipmap.a6,R.mipmap.a7,R.mipmap.a8,R.mipmap.a9,R.mipmap.a10,};//图片的id数组 for (int i=0;i<resids.length;i++){ Bean bean = new Bean("item" + i, resids[i]);//创建对象存入数据 list.add(bean);//数据存入集合中 } MyAdapter myAdapter = new MyAdapter(this, list);//新建适配器并且传入数据的集合 lv.setAdapter(myAdapter);//设置适配器 }
下面是适配器中使用到的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv" android:layout_width="200dp" android:layout_height="200dp"/> <TextView android:id="@+id/tv" android:textSize="30sp" android:gravity="center" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
好了今天的内容就到这里,后续我会加上网络加载和适配器优化等内容,大家有什么建议在下方留言哦。