安卓学习之路_20140422_BaseAdapter点击监听事件、GridView

1、BaseAdapter点击监听事件

昨天学习了BaseAdapter的使用方法,今天主要是学习的BaseAdapter的点击监听事件,隐藏View的方法,以及BaseAdapter中内存的优化

BaseAdapter的监听事件使用是实现OnItemClickListener接口,通过重写OnItemClickListener的public void onItemClick(AdapterView<?> parent, View view, int position,long id)方法在方法中写我们自己的点击监听触发的事件。


隐藏View的方法:

(1)、在布局文件中给view设置android:visibility="gone"  三个值:gone、visible、invisible,其中gone和invisible的性质差不多,都是默认隐藏,visible是显示;

(2)、通过设置指定view的setVisibilit方法来进行隐藏和显示,用到的三个值和布局文件中的三个值是一样的;

 

下面是通过点击触发来显示一个Item的TextView的显示和隐藏示例:

示例代码:

(1)、HelpAdapter类

import java.util.List;
import java.util.Map;

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 HelpAdapter extends BaseAdapter {

	Context con;
	List<Map<String, Object>> list;
	private LayoutInflater mInflater;
	public boolean onDown[];
	public int num = -1;

	public HelpAdapter(Context con, List<Map<String, Object>> list) {
		this.con = con;
		this.list = list;
		mInflater = LayoutInflater.from(con);
		onDown = new boolean[getCount()];
	}

	@Override
	public int getCount() {
		return list.size();
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		AllView allview = new AllView();
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.help_listview, null);
			allview.title = (TextView) convertView.findViewById(R.id.title);
			allview.info = (TextView) convertView.findViewById(R.id.info);
			convertView.setTag(allview);
		} else {
			allview = (AllView) convertView.getTag();
		}

		if (onDown[position]) {
			allview.info.setVisibility(View.VISIBLE);
		} else {
			allview.info.setVisibility(View.GONE);
		}


		allview.title.setText((CharSequence) list.get(position).get("title"));
		allview.info.setText((CharSequence) list.get(position).get("info"));

		return convertView;
	}

	public class AllView {
		TextView title, info;

	}

}
在这里面我们用到了一个优化内存的代码

if (convertView == null) {
			convertView = mInflater.inflate(R.layout.help_listview, null);
			allview.title = (TextView) convertView.findViewById(R.id.title);
			allview.info = (TextView) convertView.findViewById(R.id.info);
			convertView.setTag(allview);
		} else {
			allview = (AllView) convertView.getTag();
		}
如果不用if else也可以达到同样的效果,但是通过if的判断,程序第一次执行的时候首先判断convertView是否为空,第一次进来的时候,convertView的值肯定是为空的,这时候我们执行我们的xml转view的操作和各个控件的初始化,并通过setTag()方法这样我们下次执行的时候就可以直接通过getTag()方法得到我们的索要的三个控件,这样对内存的优化是很明显的,减少了程序的执行步骤,使程序的运行效率提高。

(2)Help_Activity类

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.jdc.util.Tools;

public class HelpActivity extends Activity implements OnItemClickListener{
	
	ListView lv;
	HelpAdapter helpAdapter;
	boolean[] onDown;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Tools.setFullScreen(this);
		setContentView(R.layout.activity_help);
		lv = (ListView) findViewById(R.id.list);
		helpAdapter = new HelpAdapter(this, getData()); 
		onDown = new boolean[getData().size()];
		lv.setAdapter(helpAdapter);
		lv.setOnItemClickListener(this);
	}
	
	public List<Map<String, Object>> getData(){
		
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("title", "游戏操作");
		map.put("info", "点屏幕撒");
		list.add(map);
		for (int i = 0; i < 40; i++) {
			map = new HashMap<String, Object>();
			map.put("title", "游戏系统");
			map.put("info", "我也不晓得该咋个介绍");
			list.add(map);
		}
		
		return list;
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
			
		helpAdapter.onDown[position] = !helpAdapter.onDown[position];
		helpAdapter.notifyDataSetChanged();
				
	}
	
}
这里我们是点击每一个Item都可以展开和隐藏的,具体的思路是通过定义一个Boolean类型的数组,用来控制每一个item的显示和隐藏,false为隐藏,true为显示,这个数组的长度等于我们的Item的大小,初始的info控件是不显示的,当我们点击item的时候就会显示,并且不会消失,当我们点击了item的时候,我们就把当前的item的info控件置为true,就是一个取反的操作,然后刷新一下Adapter,在Adapter类中我们做一个判断,如果当前的boolean数组的值为true,我们就通过setVisible设置它的显示属性为visible显示,否则就为FALSE就不显示;

(3)、item的布局文件

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
	<TextView 
	    android:id="@+id/title"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:layout_marginLeft="20dp"
	    android:textSize="22sp"
	    android:textColor="#FFFFFF"/>
	
	<TextView 
	    android:id="@+id/info"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:layout_marginLeft="20dp"
	    android:textSize="15sp"
	    android:textColor="#FFFFFF"
	    android:visibility="gone"/>
    
</LinearLayout>
运行效果:




2、GridView

GridView就是我们常见的桌面效果的一块一块的效果,具体的实现今天没有时间去深入研究,老师只讲了一下大概,明天再深入学习,具体的代码如下

import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class GridViewBaseAdapterActivity extends Activity {
	// 定义GridView控件
	private GridView mGrid;
	// 应用信息所存放的集合
	private List<ResolveInfo> mApps;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		loadApps();
		// 设置布局
		setContentView(R.layout.main);
		// 初始化GridView控件
		mGrid = (GridView) findViewById(R.id.grid);
		// 设置适配器
		mGrid.setAdapter(new AppsAdapter());
	}

	// 获取到应用信息的内容并存在mApps集合中
	private void loadApps() {
		Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
		mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
		// 得到应用程序的包信息
		mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
	}

	public class AppsAdapter extends BaseAdapter {
		public AppsAdapter() {
		}

		public final int getCount() {
			return mApps.size();
		}

		public final Object getItem(int position) {
			return mApps.get(position);
		}

		public final long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView i;

			if (convertView == null) {
				// 利用代码初始化一个ImageView
				i = new ImageView(GridViewBaseAdapterActivity.this);
				// 设置图片的显示方式
				i.setScaleType(ImageView.ScaleType.FIT_CENTER);
				// 设置ImageView一个宽高
				i.setLayoutParams(new GridView.LayoutParams(50, 50));
			} else {
				i = (ImageView) convertView;
			}
			// 通过ResolveInfo得到位置的包,通过应用程序的包名得到应用程序的图片。
			ResolveInfo info = mApps.get(position);
			i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));
			// i.setBackgroundDrawable(info.activityInfo
			// .loadIcon(getPackageManager()));

			return i;
		}
	}

}

学习感受:

今天主要学习的是对BaseAdapter的点击监听和对Item的隐藏和显示操作,还有一种方法是通过面向对象的思想来设置显示和隐藏,但是我做的会出现到索引异常的问题,对于这个问题还需要好好研究下,所以暂时就掌握了用数组来控制,这种方法的思路也比较简单实用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值