android listview的item的展开与隐藏
来源:互联网 发布:华测rtk如何导出数据 编辑:程序博客网 时间:2024/05/21 17:00
实现listview展开与隐藏item的思路:
在item布局里面在写一个布局,使用布局方式根据需要来(如果需要展开的item在点击的item上面,就使用相对布局或者帧布局;如果需要展开的item在点击的item下面,就是线性布局的垂直布局)
效果图:
import java.util.ArrayList;import java.util.HashMap;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity { private ListView listview; private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initView(); initData(); } private void initView() { listview = (ListView) findViewById(R.id.listview); } private void initData() { ArrayList<HashMap<String, String>> datas = new ArrayList<HashMap<String, String>>(); for (int i = 1; i < 50; i++) { HashMap<String, String> item = new HashMap<String, String>(); item.put("phone", (i + 10) + ""); item.put("expand", (i + 10) + "'"); datas.add(item); ListviewExpand adapter = new ListviewExpand(mContext, datas); listview.setAdapter(adapter); } } private class ListviewExpand extends BaseAdapter { private Context mContext; private ArrayList<HashMap<String, String>> list; private int currentItem = -1; // 用于记录点击的 Item 的 position,是控制 item 展开的核心 public ListviewExpand(Context mContext, ArrayList<HashMap<String, String>> datas) { this.mContext = mContext; this.list = datas; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { Viewholder holder; if (convertView == null) { holder = new Viewholder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.item, null); holder.textview = (TextView) convertView .findViewById(R.id.textview); holder.expand = (TextView) convertView .findViewById(R.id.expand); convertView.setTag(holder); } else { holder = (Viewholder) convertView.getTag(); } // 注意:我们在此给响应点击事件的区域)添加Tag,为了记录点击的 position,我们正好用 position 设置 Tag holder.textview.setTag(position); holder.textview.setText(list.get(position).get("phone")); holder.expand.setText(list.get(position).get("expand")); if (currentItem == position) { holder.expand.setVisibility(View.VISIBLE); } else { holder.expand.setVisibility(View.GONE); } holder.textview.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { // 用 currentItem 记录点击位置 int tag = (Integer) view.getTag(); if (tag == currentItem) { // 再次点击 currentItem = -1; // 给 currentItem 一个无效值 } else { currentItem = tag; } // 通知adapter数据改变需要重新加载 notifyDataSetChanged(); // 必须有的一步 } }); return convertView; } class Viewholder { private TextView textview; private TextView expand; } }}
主界面就是一个listview,就不写了
item布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="center" /> <TextView android:id="@+id/expand" android:layout_width="match_parent" android:layout_height="30dp" android:layout_margin="10dp" android:background="#AAAAAA" android:gravity="center" /></LinearLayout>
另外,展开的布局可以有很多,简单的复杂的都可以,现在说一下如果展开的是gridview
即:listview嵌套gridview,这种情况可能会出现展开的gridview高度会有问题
解决方法:实现自定义gridview,重写onMeasure即可
public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 设置不滚动 */ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
若还不行,还可以动态设置gridview高度,根据gridview所有子item的高度来设置gridview高度
/** * 动态获取gridview高度 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public static void setGridViewHeightBasedOnChildren(GridView listView, int num) { // 获取listview的adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } // 固定列宽,有多少列 int col = num;// listView.getNumColumns(); int totalHeight = 0; // i每次加4,相当于listAdapter.getCount()小于等于4时 循环一次,计算一次item的高度, // listAdapter.getCount()小于等于8时计算两次高度相加 for (int i = 0; i < listAdapter.getCount(); i += col) { // 获取listview的每一个item View listItem = listAdapter.getView(i, null, listView); int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.EXACTLY); listItem.measure(desiredWidth, 0); // 获取item的高度和 totalHeight += listItem.getMeasuredHeight(); } // 获取listview的布局参数 ViewGroup.LayoutParams params = listView.getLayoutParams(); // 设置高度 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { if (num == 3) { params.height = totalHeight + ((listAdapter.getCount() / 3) * 15); } else { params.height = totalHeight; } return; } else { params.height = totalHeight + (listView.getVerticalSpacing() * (listAdapter.getCount() / num)); } // 设置参数 listView.setLayoutParams(params); }
demo源码下载
0 0
- android listview的item的展开与隐藏
- Android--ListView点击Item展开的实现
- 点击ListView的item展开隐藏的view
- android的ListView点击item使item展开的做法
- ListView点击Item展开隐藏项(单项展开、多项展开、复杂布局时的展开处理)
- Android ListView点击Item展开隐藏项,单个展开,多个展开
- 点击istview的item,控制item的footer的展开与隐藏
- ListView 展开与隐藏
- 支持每个item展开的listview
- ListView的item展开后完整显示
- ListView的item展开后完整显示
- android实现Listview的点击展开和隐藏功能
- ListView Item 点击展开隐藏问题
- ListView子项item的显示与隐藏
- ListView中的item以动画的形式展开
- Android—ListView Item 展开动画效果
- Android—ListView Item 展开动画效果
- android之listview点击item展开内容
- ibatis $ 和 # 的区别
- 使用scanf函数时应该注意的问题
- SAP 请勿打扰
- CSS经验分享
- 从mms源码看IM应用的架构<二>
- android listview的item的展开与隐藏
- 读书摘要——第四章
- 安卓软键盘的关闭
- 利用通知监测键盘高度
- hadoop shell收集
- dd 与cp的区别
- java.util.concurrent源码学习一
- 16.7.14 B 组总结
- MogoDB在线教程