ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。监听用户点击Item,判断下当前是可见还是不可见,实时进行状态的转换即可。
效果图如下:
下面看代码:
MainActivity.java: 设置数据源
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);
}
}
MainAdapter.java:
自定义Adapter,在getView中实现我们的效果:
public class MainAdapter extends BaseAdapter {
// private Context context;
private List<Map<String, String>> data;
private LayoutInflater layoutInflater;
public MainAdapter(Context context, List<Map<String, String>> data) {
// this.context = context;
this.data = data;
layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
class ViewHolder {
RelativeLayout rlListItem;// 点击展开或收起ViewStub
View vsOperations;// 点击后显示的更多的操作
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) {
convertView = layoutInflater.inflate(R.layout.list_item_main_task,
null);
viewHolder = new ViewHolder();
viewHolder.rlListItem = (RelativeLayout) convertView
.findViewById(R.id.rl_list_item);
viewHolder.vsOperations = (ViewStub) convertView
.findViewById(R.id.vs_detail_operations);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.vsOperations.setVisibility(View.GONE);
}
viewHolder.rlListItem.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (viewHolder.vsOperations.getVisibility() == View.GONE) {
if(viewHolder.vsOperations instanceof ViewStub){
//关键!
viewHolder.vsOperations = ((ViewStub)viewHolder.vsOperations).inflate();
}
viewHolder.vsOperations.setVisibility(View.VISIBLE);
} else {
viewHolder.vsOperations.setVisibility(View.GONE);
}
}
});
Log.e("111", "getView");
return convertView;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
}
activity_main.xml:主界面布局就一个ListView
<RelativeLayout 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
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
list_item_main_task.xml: ListView中的每个Item,注意里面的ViewStub,通过它来引用一个布局文件,即隐藏的操作按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!-- 每个ListItem除了ViewStub,都在这个标签里面 -->
<RelativeLayout
android:id="@+id/rl_list_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_list_item_task"
android:gravity="center" >
<!-- android:descendantFocusability="blocksDescendants" 当ListView setOnItemClickListener点击没有效果的时候,加上这个 -->
<!-- 任务的名称和超期时间 -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_task_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="任务1"
android:textColor="#404040"
android:textSize="22dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_over_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="超期2天"
android:textColor="#ff0000"
android:textSize="15dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:text="张小三"
android:textColor="#333333"
android:textSize="15dp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<ViewStub
android:id="@+id/vs_detail_operations"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/view_stub_tool_bar" />
</LinearLayout>
view_stub_tool_bar.xml: 被隐藏的操作按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingTop="8dip"
android:background="@drawable/bg_list_item_task_view_stub" >
<ImageButton
android:id="@+id/btn_compelete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="55dp"
android:background="@null"
android:src="@drawable/ico_complete_selector" />
<ImageButton
android:id="@+id/btn_important"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="55dp"
android:background="@null"
android:src="@drawable/ico_important_selector" />
<ImageButton
android:id="@+id/btn_"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="55dp"
android:background="@null"
android:src="@drawable/ico_notify_selector" />
<ImageButton
android:id="@+id/btn_"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="55dp"
android:background="@null"
android:src="@drawable/ico_love_selector" />
<ImageButton
android:id="@+id/btn_"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:minHeight="55dp"
android:background="@null"
android:src="@drawable/ico_share_selector" />
</LinearLayout>
一些资源文件这里就不贴出来了,有兴趣的同学可以下载demo来看看。
使用ViewStub的好处是,它并没有实例化这个View对象,而是在用户点击的时候才进行实例化,这样可以提高效率。特别是当你的listItem比较复杂的时候,效果很明显。
项目地址:https://github.com/michaelye/ViewStubDemo.git
- 大小: 967.6 KB
分享到:
相关推荐
Android UI优化之merge标签的使用,主要介绍ViewStub方法使用的注意事项及方法实现。
ListView之ViewStub的使用
本文档福利发放... 里面是android代码,实现的是动态添加控件和viewstub使用的例子。东西比较简单,仅适合初学者。
我们知道布局优化有三个标签,include 、merge 和 ViewStub。 我们可以把公共的布局抽取到一个 xml 中,然后使用 include 来引用; 布局会分层次,如果里层和上一层是同样的容器,则可以使用 merge,但记住一点,...
当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点: 1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相...
利用ViewStub显示和隐藏布局 运用View.VISIBLE和View.GONE去改变布局的可见性.
Android下使用ViewStub控件动态懒加载。可以参见博客:http://www.cnblogs.com/plokmju/p/android_ViewStub.html
初次学习使用viewStub,做个简单viewstub小例子。
DataBinding中ViewStub例子
这是一个关于Android Layout布局复用的简单示例。
NULL 博文链接:https://edison-cool911.iteye.com/blog/940103
主要介绍了Android在layout xml中使用ViewStub完成动态加载问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下
But the ViewStub is an invisible and zero-sized view that can be used to lazy loading on demand. Similarly, with reduce memory usage, use ViewStub can also speed up rendering by loading the views ...
第三章 Android开发 使用ViewStub延迟展开视图.docx
Android 使用ViewStub 实现Activity 页面不同状态动态切换。可以直接继承使用,也可以根据自己的需求进行优化。。
android 用ViewStub实现Tab选项卡效果
惰性控件ViewStub实现布局东动态加载,在手机页面点击展开按钮,在按钮下方会出现一个页面。常用在查看商品的详细信息。
在Android开发中,很容易就能创建出复杂的UI结构,结果呢,用了很多的View,且其中的一些很少使用。针对这种情况,谢天谢地,Android还为我们提供了一个特别的构件——ViewStub,它可以使你充分享受的好处而不会造成...
ViewStub可以在运行时动态的添加布局。帮助文档给定的定义是: “A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime. When a ViewStub is made visible...