android listview 懒加载,ListView之ViewStub的懒加载!

ViewStub 也是个View,但是懒加载,可以提前加入到 xml的布局文件中,但是不会加载,它的默认情况下是 View.GONE 当你把他设置成 View.Visable它会调用自己的inflate()方法

* 这时候才 真正去构建自己,注意它的inflate()方法只能被调用一次!;所以为了提高性能,有个元素不需要一开始就加载可以考虑用 ViewStub,此外还有一个merg元素也是懒加载。

老规矩,先看效果图:

0818b9ca8b590ca3270a3433284dd417.png

使用很简单。看代码来得快。先看activity_main.xml布局文件:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

android:id="@+id/lv_list"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

下面是MainActivity.java代码,都很简单的:

package com.michael.viewstubdemo;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ListView;

public class MainActivity extends Activity {

private ListView lvList;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lvList = (ListView)findViewById(R.id.lv_list);

List> data = new ArrayList>();

Map map;

for(int i = 0; i < 20; i++){

map = new HashMap();

map.put("1234", "1234");

data.add(map);

}

MainAdapter mainAdapter = new MainAdapter(this, data);

lvList.setAdapter(mainAdapter);

}

}最重要的代码就是 ListView的适配器了:

package com.michael.viewstubdemo;

import java.util.List;

import java.util.Map;

import android.content.Context;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.view.ViewStub;

import android.widget.BaseAdapter;

import android.widget.ImageButton;

import android.widget.RelativeLayout;

/**

* ViewStub 也是个View,但是懒加载,可以提前加入到 xml的布局文件中,但是不会加载,它的默认情况下是 View.GONE 当你把他设置成 View.Visable它会调用自己的inflate()方法

* 这时候才 真正去构建自己,注意它的inflate()方法只能被调用一次!;所以为了提高性能,有个元素不需要一开始就加载可以考虑用 ViewStub,此外还有一个merg元素也是懒加载。

* @author liucheng liucheng187@qq.com

*/

public class MainAdapter extends BaseAdapter {

private List> data;

private LayoutInflater layoutInflater;

public MainAdapter(Context context, List> data) {

this.data = data;

layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

class ViewHolder {

RelativeLayout rl_list_item;// 点击展开或收起ViewStub

View viewStub;// 点击后显示的更多的操作 --注意这里用View作为数据类型,而不用ViewStub的用意!

ImageButton ibCompelete;// 打钩按钮

ImageButton ibImportant;// 感叹号按钮

ImageButton ibNotify;// 提醒按钮

ImageButton ibLove;// 爱心按钮

ImageButton ibShare;// 分享按钮

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

final ViewHolder viewHolder;

if (convertView == null) {

viewHolder = new ViewHolder();

//convertView = layoutInflater.inflate(R.layout.list_item_main_task,null);

convertView = View.inflate(parent.getContext(),R.layout.list_item_main_task,null);

viewHolder.rl_list_item = (RelativeLayout) convertView.findViewById(R.id.rl_list_item);

viewHolder.viewStub = (ViewStub) convertView.findViewById(R.id.vs_detail_operations);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) convertView.getTag();

viewHolder.viewStub.setVisibility(View.GONE);

}

viewHolder.rl_list_item.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if (viewHolder.viewStub.getVisibility() == View.GONE) { //ViewStub初始状态时Gone

if(viewHolder.viewStub instanceof ViewStub){//ViewStub只能被infalte一次,一旦构建后就变成view了。

viewHolder.viewStub = ((ViewStub)viewHolder.viewStub).inflate();

}

viewHolder.viewStub.setVisibility(View.VISIBLE);

} else {

viewHolder.viewStub.setVisibility(View.GONE);

}

}

});

Log.e("111", "getView");

return convertView;

}

@Override

public int getCount() {

return data.size();

}

@Override

public Object getItem(int position) {

return data.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

}

完整项目运行,不要分,,,

下载导入即可运行!

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值