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年8月1日
    3
  • 开源3d可视化软件_开源的可视化大屏

    开源3d可视化软件_开源的可视化大屏第一节、 技术开发环境中的社会环境    这篇文章迟迟没有写出来奉献给一些爱好音频视频开发的网友,是有很多原因的,TI在短时间内,针对高清音视频方案DM365/368,连续发布DVSDK3.0,DVSDK4.00,DVSDK4.01和DVSDK4.02,这点让我们很不适应。虽然我们的DM365/368核心板早已经出来,但是需要做开发板,并调试开…

    2022年8月13日
    5
  • EXCEL宏编程纪念

    EXCEL宏编程纪念       不久前被叫去编写宏,这EXCEL宏真是麻烦! 可能以后不会再遇到有编写宏的经历了,故而贴出来以做个纪念: Subdirect_Price()query_dir_volume宏由颜清国编写,时间:2007-4-9定义变量DimcRowsAsInteger总行数DimcColumnsAsInteger总列数DimHEADERCOLORINDE

    2022年5月5日
    38
  • WeakHashMap的原理

    WeakHashMap的原理简介WeakHashMap和HashMap一样,WeakHashMap也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以为null。不过WeakHashMap的键是“弱键”(注:源码中Entry中的定义是这样的:privatestaticclassEntry&lt;K,V&gt;extendsWeakReference implementsMap.Ent…

    2022年5月31日
    28
  • 计算机用户名,账户名更改

    计算机用户名,账户名更改计算机用户名,winr按键同时,输入netplwiz.进入用户账户界面(高级),双击即可更改。账户名更改,通过控制面板更改。

    2022年10月14日
    0
  • pytorch实现textCNN

    pytorch实现textCNNpytorch实现textCNN1.原理2.数据预处理2.1转换为csv格式2.2观察数据分布2.3由文本得到训练用的mini-batch数据3.模型4.训练脚本5.main函数6.引用1.原理2014年的一篇文章,开创cnn用到文本分类的先河。ConvolutionalNeuralNetworksforSentenceClassification原理说简单也简单…

    2022年6月28日
    27

发表回复

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

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