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的隐藏和显示操作,还有一种方法是通过面向对象的思想来设置显示和隐藏,但是我做的会出现到索引异常的问题,对于这个问题还需要好好研究下,所以暂时就掌握了用数组来控制,这种方法的思路也比较简单实用。