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)
上一篇 2022年6月28日 下午3:46
下一篇 2022年6月28日 下午3:46


相关推荐

  • docker部署jenkins安装使用教程_免费docker容器

    docker部署jenkins安装使用教程_免费docker容器前言使用docker安装jenkins环境,jenkins构建的workspace目录默认是在容器里面构建的,如果我们想执行python3的代码,需进容器内部安装python3的环境。进jenki

    2022年7月31日
    8
  • Linux 下一个 Mysql error 2002 错误解决

    Linux 下一个 Mysql error 2002 错误解决

    2022年1月13日
    88
  • @PostConstruct注解详解

    @PostConstruct注解详解初始化方式一 PostConstruc 注解假设类 UserControll 有个成员变量 UserService 被 Autowired 修饰 那么 UserService 的注入是在 UserControll 的构造方法之后执行的 如果想在 UserControll 对象生成时候完成某些初始化操作 而偏偏这些初始化操作又依赖于依赖注入的对象 那么就无法在构造函数中实现 ps spring 启动时初始化异常 例如 publicclassU

    2026年3月26日
    2
  • Window系统内核版本号及其查看方法「建议收藏」

    Window系统内核版本号及其查看方法「建议收藏」一.WindowsNTWindwosNT是一系列操作系统的总称。WindowsNT(NewTechnology)是Microsoft在1993年推出的面向工作站、网络服务器和大型计算机的网络操作系统,也可做PC操作系统。它与通信服务紧密集成,基于OS/2NT基础编制。OS/2由微软和IBM联合研制,分为微软的MicrosoftOS/2NT与IBM的IBMOS/2。

    2022年8月23日
    16
  • jlink接口定义接stm32_图解STM32 JLink 采用JTAG 模式和 SWD模式下载时引脚说明「建议收藏」

    jlink接口定义接stm32_图解STM32 JLink 采用JTAG 模式和 SWD模式下载时引脚说明「建议收藏」因为项目开发需要,采用SWD模式下载STM32,以前都是用JLINKv8的JTAG模式,而且从未认真识别过JLINKv8各引脚。只知道SWD模式下和JTAG模式下共用两个引脚而已。只有明确了v8的各引脚定义才可以自己用杜邦线取其中的几个引脚作SWD模式的下载!!!实际测试,当JATG正面拿在手里时,即缺口在上方。1、2引脚代表VDD。4、6、8、10、12、14、16、18、20引脚都为VSS。…

    2022年5月8日
    473
  • HTML5实战与剖析之HTMLDocument变化(readyreState属性、兼容模式和head属性)「建议收藏」

    HTML5实战与剖析之HTMLDocument变化(readyreState属性、兼容模式和head属性)「建议收藏」之前为大家介绍了些许关于HTML5新添加的小东东,想必大家也有所了解了。今天为大家介绍HTML5中有关HTMLDocument方面新添加的内容。那么HTML5中有关HTMLDocument方面新添加的内容都有什么呢?HTML5中有关HTMLDocument方面新添加的内容有readyState属性、兼容模式判断和head属性。下面就为大家一一介绍这些新添加的小东东吧。

    2022年7月19日
    29

发表回复

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

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