自定义ListView的好处:
Android的ListView给我们提供了几个已经定义的adapter例如SimpleAdapter、ArrayAdapter等,但是这个是他们定义好的,只能添加规定的内容,要是想只在Listview中添加个文字或者图片用而想要在Listview中添加自己想要的效果或者数据就需要自定义Listview了
使用ListView控件+BaseAdapter实现如下图所示的功能。
要求:ListView中文字的长度小于等于3,图标显示为为“猫”,文字长度在3到5之间的,图标显示为“小狗”,其它情况下图标显示为“小鸭子”。(要优化ListView控件的性能)
先看一下效果图
可以动态向自定义的ListView中添加文字;
先给出主界面代码:
package com.example.mylistview;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
/**
* @author Bri
*
* @version 2015-10-27 17:28
*/
public class MainActivity extends Activity {
private ListView lv;
List<String> list = new ArrayList<String>();
EditText et_addContent;
private Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 默认添加数据
list.add("1");
list.add("12");
list.add("zml2015");
list.add("1234");
list.add("12345");
list.add("123456");
et_addContent = (EditText) findViewById(R.id.et_addContent);
bt = (Button) findViewById(R.id.bt_addContent);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String addContent = et_addContent.getText().toString().trim();
if (addContent.equals(""))
Toast.makeText(MainActivity.this, "请输入有效内容",
Toast.LENGTH_SHORT).show();
else {
list.add(addContent);
Toast.makeText(MainActivity.this, "添加成功",
Toast.LENGTH_SHORT).show();
et_addContent.setText("");
}
}
});
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyListViewAdapter(list, R.layout.lv_item,
MainActivity.this));
}
}
自定义的ListView的适配器:
package com.example.mylistview;
import java.util.List;
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.ListAdapter;
import android.widget.TextView;
/**
* @author Bri
*@param data 用于动态添加字符的list数据集
*@param context 上下文
*@param layout 添加在listview中的布局
*/
public class MyListViewAdapter extends BaseAdapter implements ListAdapter {
private List<String> data;
private int layout;
private Context context;
private ImageView iv = null;
private TextView tv = null;
public MyListViewAdapter(List<String> data, int layout, Context context) {
this.data = data;
this.layout = layout;
this.context = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return data.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int arg0, View view, ViewGroup arg2) {
if (view == null) {
view = LayoutInflater.from(context).inflate(layout, null);
iv = (ImageView) view.findViewById(R.id.iv);
tv = (TextView) view.findViewById(R.id.tv);
view.setTag(new ObjectClass(iv, tv));
} else {
ObjectClass objectclass = (ObjectClass) view.getTag();
iv = objectclass.iv;
tv = objectclass.text;
}
if (data.get(arg0).length() <= 3)
iv.setImageResource(R.drawable.p_1);
else if (data.get(arg0).length() <= 5)
iv.setImageResource(R.drawable.p_2);
else if (data.get(arg0).length() > 5)
iv.setImageResource(R.drawable.p_3);
tv.setText(data.get(arg0));
return view;
}
//用于临时保存TextView和ImageView控件的信息,不然的话会报空指针异常,
//<span style="font-family: Arial, Helvetica, sans-serif;">当然了有人自定义ViewHolder目的是一样</span>的
private final class ObjectClass {
ImageView iv = null;
TextView text = null;
public ObjectClass(ImageView iv, TextView text) {
this.iv = iv;
this.text = text;
}
}
}
布局文件及其他详细代码可以去这里下载点击打开链接