ViewStub的使用

ViewStub的使用ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。监听用户点击Item,判断下当前是可见还是不可见,实时进行状态的转换即可。效果图如下:   下面看代码:MainActivity.java:设置数据源 publicclassMainActiv…

大家好,又见面了,我是你们的朋友全栈君。

ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。监听用户点击Item,判断下当前是可见还是不可见,实时进行状态的转换即可。

效果图如下:

 

ViewStub的使用

 

 

下面看代码:

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153952.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP情人:p十几天来学习hp第一天

    PHP情人:p十几天来学习hp第一天

    2022年1月3日
    49
  • ajax面试题及答案_javase面试题

    ajax面试题及答案_javase面试题前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yAJAX常见面试题什么是AJAX,为什么要使用AjaxAJAX是“AsynchronousJavaScriptandXML”的缩写。他是指一种创建交互式网页应用的网页开发技术。、客户端与服务器,可以在【不必刷新整个浏览器】的情况下,与服务器进行异步通讯的技术AJAX应用和传统Web应用有什么不同?AJAX应用和传统Web应用

    2022年8月27日
    6
  • tensorflow模块安装

    tensorflow模块安装

    2021年11月19日
    47
  • 详解Jvm内存结构

    详解Jvm内存结构近期在学习研究内存,那么Jvm内存结构和Jvm的内存模型即JMM(Javamomerymodel)这两项内容都是学习java虚拟机、java内存知识的基础。为了让自己加深理解,有不至于嵌入到底层细节太深,会通过一段代码片段类比到内存结构图中的真实呈现。一、Jvm体系的内存结构图JVM运行数据区,也就是我们所说的内存结构主要分为两个大区:1、线程共享区**方法区(MethodArea)????*存储运行时的常量池、被虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码数据。**堆区(

    2022年5月8日
    48
  • 一文让你彻底搞懂最小二乘法(超详细推导)「建议收藏」

    一文让你彻底搞懂最小二乘法(超详细推导)「建议收藏」1.要解决的问题因果关系,观测值与预测值

    2022年5月13日
    53
  • activiti7实战教程(二)作图「建议收藏」

    activiti7实战教程(二)作图「建议收藏」IDEA:2018.2.2插件:actibpm新建BPMN文件依次拖出需要的组件,最好按照流程的顺序进行拖出,这样后面看xml的时候比较直观。修改每个节点的名称填写每个审批节点的伪码:科室长、分管领导、采购人员、以及网关的伪码表达式这样流程图就做好了。接下来要根据流程图生成XML文件和png图片复制一份流程图,修改名称:后缀名加上20.xml在xml文件上右键到此为止,整个流程图作图就完整的结束了。另外呢告知一点,流程图…

    2022年7月21日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号