Android ListView点击展开收起效果(一)

本文介绍了如何在Android中实现ListView点击展开收起的效果,主要通过修改BaseAdapter的getCount()方法来实现。文中提供了Activity和Adapter的代码示例,并总结了实现该功能的三个关键步骤:添加页脚视图、点击事件处理、调整getCount()值。最后展示了Demo的截图。

【声明】此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail

公司的项目是社区购物商城(o2o),大量的需要用到ListView的各种效果,ListView展开收起、头部(Head)和子部(Item)这种结构的ListView,特别是第二种用得最多。写过很多次了,在这里写记录一下自己的笔记,也希望能帮助到有需要的Coder。

一、首先上几种效果:

① ListView点击展开收起

② 头部(Head)和子部(Item)的ListView

 Android 的系统组件ExpandableListView

相比较,三种ListView的效果都比较相似,第一种实现起来最简单,第二种比较复杂一点,第三种系统提供的拿过来直接用就可以,原始的样式非常Low,可以自己修改一下。


、主要介绍:ListView点击展开收起的效果(第一种)

这篇博文主要介绍的是第一种ListView点击展开收起的效果,其他几种会在接下来的的博文中介绍。我们知道在BaseAdapter中有一个getCount()的方法,这个方法大家都不陌生,就是数据的数量值,这种简单的ListView点击展开收起的效果就是利用这个方法来做文章的。下面我们来看代码:

1、Activity

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ListView;

/**
 * 主页
 * 
 * @author Endoon 2016-1-26 16:57:34
 */
public class MainActivity extends Activity {
	private MyAdapter myAdapter;
	private ListView listView;
	private List<String> list;
	private View footView;
	private ImageView ivDown;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView) findViewById(R.id.listview);
		// 获得页脚布局
		footView = getLayoutInflater().inflate(R.layout.view_foot, null);
		ivDown = (ImageView) footView.findViewById(R.id.iv_down);

		initData();

		initEvent();
	}

	/**
	 * 初始化数据
	 */
	private void initData() {
		// 初始化模拟数据
		simulateData();

		// 添加页脚视图
		listView.addFooterView(footView);
		ivDown.setImageDrawable(getResources()
				.getDrawable(R.drawable.icon_down));

		// 适配
		myAdapter = new MyAdapter(MainActivity.this, list);
		listView.setAdapter(myAdapter);
	}

	/**
	 * 初始化点击事件
	 */
	private void initEvent() {
		ivDown.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View view) {
				// 判断getCount()数据的数量,如果等于3点击后就设置getCount()为全部数量,设置修改标识,刷新。
				// 否则,相反。
				if (myAdapter.getCount() == 3) {
					myAdapter.addItemNum(list.size());
					ivDown.setImageDrawable(getResources().getDrawable(
							R.drawable.icon_up));
					myAdapter.notifyDataSetChanged();
				} else {
					myAdapter.addItemNum(3);
					ivDown.setImageDrawable(getResources().getDrawable(
							R.drawable.icon_down));
					myAdapter.notifyDataSetChanged();
				}
			}
		});
	}

	/**
	 * 模拟数据
	 * 
	 * @return
	 */
	private List<String> simulateData() {
		list = new ArrayList<String>();
		for (int i = 0; i < 10; i++) {
			String circleStr = "蓝色威尼斯城" + (i + 1) + "座";
			list.add(circleStr);
		}
		return list;
	}

}
注意:这里的3是自定义的,可以根据自己实际项目需求修改。

2、Adapter

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

	private List<String> list;
	private LayoutInflater inflater;
	private int itemCount = 3;

	public MyAdapter(Context context, List<String> list) {
		this.list = list;
		inflater = LayoutInflater.from(context);
	}

	@Override
	public int getCount() {
		// 这里是关键
		// 如果数据数量大于3,只显示3条数据。这里数量自己定义。
		// 否则,显示全部数量。
		if (list.size() > 3)
        {
			return itemCount;
        }else 
        {
        	return list.size();
		}
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder = null;
		
		if (convertView == null) {
			viewHolder = new ViewHolder();
			convertView = inflater.inflate(R.layout.item_simple_listview, null);
			viewHolder.tvCircleName = (TextView) convertView.findViewById(R.id.tv_circie_name);
			convertView.setTag(viewHolder);
		}else 
		{
			viewHolder = (ViewHolder) convertView.getTag();
		}
		viewHolder.tvCircleName.setText(list.get(position));
		return convertView;
	}
	
	class ViewHolder
	{
		TextView tvCircleName;
	}
	
	/**
	 * 点击后设置Item的数量
	 * @param number
	 */
	public void addItemNum(int number)
    {
	    itemCount = number;
    }
}
通过,公共方法addItemNum来修改getCount()的显示,这里起了主要作用!

三、总结

由于项目比较急,所以就用了这种很简单的方法实现,基本上满足了需求。在这里只做了三件事:

① 添加页脚视图。

② 点击页脚视图时,进行判断显示。

③ 修改Adapter的getCount()的值。

代码很简单,总共不过200行,相信大家都能看懂。Over!!!

四、Demo效果图

点击下载源码


☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆转载请注明出处☞指尖飞落的博客☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值