本文共 4655 字,大约阅读时间需要 15 分钟。
ListView控件是 Android 中最常用的控件之一,几乎所有的应用程序都会用到它。比如淘宝app中,有很多的商家,每个商家还有很多的商品,但是手机屏幕很小,不可能一下子将所有的商家和商品都展示出来,所以就需要使用 ListView来实现。这里我就直接上代码了,具体的代码解释会在程序中注释,在页面的最下面有下载该demo的链接地址。
代码解释:
设置分隔线颜色:android:divider="#556B2F"
设置分割线高度:android:dividerHeight="10dp"
public class Person { private int imgId ;//头像 private String name ;//姓名 private String status ;//状态信息:在线,离线 private String info ; //签名 private String date ;//日期 get和set方法省略...}
public class PersonAdapter extends ArrayAdapter{ /** * ListView 子项布局的id */ private int rescourceId; /** * 上下文 */ private Context context; public PersonAdapter(Context context, int textViewResourceId, List objects) { super(context, textViewResourceId, objects); rescourceId = textViewResourceId; this.context = context; } /** * 一、getView()方法在每个子项被滚动到屏幕内的时候 会被调用。 * 二、 提升性能: * 1、当 convertView为空 的时候, 创建一个ViewHolder对象, 并将控件的实例都存放在 * ViewHolder 里, 然后调用 View 的 setTag()方法,将ViewHolder 对象存储在 View 中。 * 2、当 convertView 不为空的时候则调用 View的 getTag()方法, 把 ViewHolder 重新取出。 * 这样所有控件的实例都缓存在了 ViewHolder 里,就没有必要每次都通过 findViewById()方法来获取控件实例了。 * 这样会使ListView的运行效率获得很大的提高 */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = null; final ViewHolder viewHolder; /** * 通过 getItem()方法获取当前项的Person实例 */ Person person = getItem(position); if (convertView == null) { /** * 如果 convertView 为空,则使用 LayoutInflater 去动态加载我们传入的子项布局, */ view = LayoutInflater.from(context).inflate(rescourceId, null); viewHolder = new ViewHolder(); /** * 调用 View 的 findViewById()方法分别 获取到页面的控件对象实例 */ viewHolder.imgView = (ImageView) view.findViewById(R.id.imageView); viewHolder.nameView = (TextView) view.findViewById(R.id.nameId); viewHolder.dateView = (TextView) view.findViewById(R.id.dateId); viewHolder.statusView = (TextView) view.findViewById(R.id.statusId); viewHolder.infoView = (TextView) view.findViewById(R.id.infoId); /** * 将ViewHolder 存储在View 中 , */ view.setTag(viewHolder); } else { /** * 1、如果不为空则直接对 convertView进行重用。 * 2、可以大大提高ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。 */ view = convertView; /** * 从view中重新获取ViewHolder */ viewHolder = (ViewHolder) view.getTag(); } /** * 1、从viewHolder中取出我们缓存的子项布局中的各个控件对象, * 2、将此次加载的Person实例中的数据加载到当前进入屏幕的子项布局中的对应控件上, * 3、完成数据到页面的展示 */ viewHolder.imgView.setImageResource(person.getImgId()); viewHolder.nameView.setText(person.getName()); viewHolder.dateView.setText(person.getDate()); viewHolder.statusView.setText(person.getStatus()); viewHolder.infoView.setText(person.getInfo()); viewHolder.imgView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(context, "修改 "+viewHolder.nameView.getText()+"的头像", 0).show() ; } }) ; /** * viewHolder存储在view中,填充数据完成之后,我们把view返回,这个view中已经是填充完数据之后的view了 * 返回布局 */ return view; } /** * 内部类 ViewHolder,用于对控件的实例进行缓存 */ class ViewHolder { ImageView imgView; TextView nameView, dateView, statusView, infoView; }}
MainActivity.java中的代码:
public class MainActivity extends Activity { private ListView listView; List项目下载地址:datas = new ArrayList (); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); /** * 初始化数据 */ initDatas() ; /** * 创建PersonAdapter对象,将子项布局id,和数据源传递进去 */ PersonAdapter adapter = new PersonAdapter(MainActivity.this, R.layout.item, datas); /** * 将PersonAdapter作为适配器传递给 了 ListView。 */ listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // TODO Auto-generated method stub Person person = datas.get(position); Toast.makeText(MainActivity.this, "您点击了 "+person.getName()+" 这项", 0).show(); } }); } SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式 /** * 获得数据 */ private void initDatas() { for (int i = 1; i < 15; i++) { Person person = new Person(); person.setImgId(R.drawable.img1); person.setName("司令" + i); person.setStatus("[在线]"); person.setInfo("我们的部队今日就要去南海了"); person.setDate(df.format(new Date())); datas.add(person); } }}