* 这时候才 真正去构建自己,注意它的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>
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<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 [email protected] */ 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;// 点击展开或收起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; } }