listview的实现

今天介绍一个关于listview的小程序,并且会粘上代码,仅供大家参考。

我们只要listview就是列表,我们开发每一个app的时候都会用到。要想使listview的页面的显示内容更加丰富更有灵活性,如果我们使用android自带的方法可能会更有局限性,布局也不会那么灵活,所以我们就需要对listview的界面进行定制要写一个listview。我们首先要写两个xml布局,一个是放有 <ListView>控件的xml文件,一个是列表中每一个item要显示的布局的xml(这里我放了一个ImageView一个TextView,大家可以布局更多的内容,不做限制)。这块我不给大家粘代码了,因为非常简单。

第二步呢,我们要定义一个实体类。它是作为listview适配器的适配类型。大家注意这里定义的两个变量和item.xml里的内容是一致的。

   public class ListViewInfo {
private String redBall;   //显示的文字
private int img; //对应图片的资源id

public ListViewInfo(String redBall,int img) {
this.redBall = redBall;
this.setImg(img);
}

public String getRedBall() {
return redBall;
}
public void setRedBall(String redBall) {
this.redBall = redBall;
}


public int getImg() {
return img;
}


public void setImg(int img) {
this.img = img;
}


}


第三步,我们要创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型指定给ListViewInfo 类。这块呢我重点说一下ViewHolder,新增这个内部类,是用于对控件的实例进行缓存。当contentview为空的时候,创建了一个ViewHolder,并将控件的实例都存放在ViewHolder里,然后调用view的setTag()方法,将ViewHolder对象存储在View中。当contentView不为空的时候调用View的getTag方法,把ViewHolder重新取出。这样所有控件的实例都缓存了在ViewHolder里,就没有必要每次都获取控件的实例了。这样呢我们也对listvie进行了优化。(在这里多说几句,listview的优化要注意哪些?第一和第二要注意的就是我们刚刚说的ViewHolder和cotentview的方式;第三就是要要注意数据的加载,要进行分页加载,第四点,就是图片的问题。)

public class ListViewAdapter extends ArrayAdapter<ListViewInfo> {
private int resourcesId;


//重写了父类的一组构造函数,用于将listview的子布局的id和数据都传递进来。
public ListViewAdapter(Context context, int resource,
List<ListViewInfo> objects) {
super(context, resource, objects);
resourcesId = resource;
}


//重写了getView方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListViewInfo listViewInfo = getItem(position); // 通过getItem获取当前实例
View view;
ViewHolder viewHolder;
//使用convertView将之间加载好的布局进行缓存。所以先判断convertView是否为空,如果为空就使用LayoutInflater加载布局
//如果不为空就可以进行重用,不需要每次都将布局重新加载一遍了。
if (convertView == null) {
//使用LayoutInflater来为这个子项加载我们传入的布局
view = LayoutInflater.from(getContext()).inflate(resourcesId, null); 
viewHolder = new ViewHolder();

//使用view.findViewById方法获取到ImageView的实例
viewHolder.img = (ImageView) view.findViewById(R.id.img);  
//使用view.findViewById方法获取到TextView的实例
viewHolder.tv = (TextView) view.findViewById(R.id.red_ball); 
view.setTag(viewHolder);// 将viewHolder存储在view中。
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();// 重新获得viewHolder
}


viewHolder.img.setImageResource(listViewInfo.getImg()); //设置图片的内容
viewHolder.tv.setText(listViewInfo.getRedBall());  //设置文字的内容


return view;
}


}


class ViewHolder {
ImageView img;
TextView tv;
}


第四步,就说一下Activity中的代码 。

public class MainActivity extends Activity {
private List<ListViewInfo> listViewInfos = new ArrayList<ListViewInfo>();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
initInfo();// 初始化数据

                //初始化适配器
ListViewAdapter adapter = new ListViewAdapter(MainActivity.this,
R.layout.listview_item, listViewInfos);

               //初始化listview的控件
ListView listView = (ListView)findViewById(R.id.listview);

               //给listview设置适配器
listView.setAdapter(adapter);
}
public void initInfo() {
ListViewInfo one = new ListViewInfo("1 2 3 4 5",R.drawable.ic_launcher);
listViewInfos.add(one);
}

}

这样一个listview就写好了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值