ListView之ViewStub的懒加载!

来源:互联网 发布:python用什么软件编写 编辑:程序博客网 时间:2024/05/23 18:57
ViewStub 也是个View,但是懒加载,可以提前加入到 xml的布局文件中,但是不会加载,它的默认情况下是 View.GONE 当你把他设置成 View.Visable它会调用自己的inflate()方法

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

老规矩,先看效果图:


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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" >    <!-- 下面这个ListView的  layout_height设置很关键的,如果设置成wrap_content会导致 item被点击时viewstub是可以出现   但是【很可能】item总高度不会变化,导致效果不对。    我开发时遇到过,但是这个demo没这个现象, 出现问题时注意下-->    <ListView        android:id="@+id/lv_list"        android:layout_width="match_parent"        android:layout_height="match_parent"         /></LinearLayout>


下面是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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lvList = (ListView)findViewById(R.id.lv_list);List<Map<String, String>> data = new ArrayList<Map<String, String>>();Map<String, String> map;for(int i = 0; i < 20; i++){map = new HashMap<String, String>();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<Map<String, String>> data;private LayoutInflater layoutInflater;public MainAdapter(Context context, List<Map<String, String>> data) {this.data = data;layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}class ViewHolder {RelativeLayout rl_list_item;// 点击展开或收起ViewStubView viewStub;// 点击后显示的更多的操作   --注意这里用View作为数据类型,而不用ViewStub的用意!ImageButton ibCompelete;// 打钩按钮ImageButton ibImportant;// 感叹号按钮ImageButton ibNotify;// 提醒按钮ImageButton ibLove;// 爱心按钮ImageButton ibShare;// 分享按钮}@Overridepublic 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (viewHolder.viewStub.getVisibility() == View.GONE) { //ViewStub初始状态时Goneif(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;}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}}

完整项目运行,不要分,,,下载导入即可运行!奋斗



0 0