最近比较忙,很久不更新Android笔记,最近学了一下Android的自定义适配器,做了一个比较水的例子
做Web开发,看了这么多例子,最烦的就是不知道别人项目各文件、包的位置,看别人的博客写了各个文件结果复制有时候不知道放在那,就比较烦,多花很多时间。先看文件目录。
自定义适配器最重要的就是继承BaseAdapter
package com.example.homework_ui4;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private Context context;
private List<Map<String,Object>> listitems;
private LayoutInflater listContainer;//视图容器
public boolean[] flag;
private class ViewHolder{
private ImageView image;
private TextView name;
private TextView msg;
private Button btn;
private CheckBox check;
}
public MyAdapter(Context context,List<Map<String,Object>> list)
{
this.context=context;
listContainer=LayoutInflater.from(context);
listitems=list;
flag=new boolean[getCount()];
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listitems.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View view, ViewGroup arg2) {
// TODO Auto-generated method stub
final int select=position;
ViewHolder vHolder=null;
if(view==null){
vHolder=new ViewHolder();
//获取布局文件视图
view=listContainer.inflate(R.layout.list_item,null);
vHolder.image=(ImageView)view.findViewById(R.id.iv);
vHolder.name=(TextView)view.findViewById(R.id.tv_name);
vHolder.msg=(TextView)view.findViewById(R.id.tv_msg);
vHolder.check=(CheckBox)view.findViewById(R.id.check);
vHolder.btn=(Button)view.findViewById(R.id.btn_detail);
//设置控件集到convertView
view.setTag(vHolder);
}
else{
vHolder=(ViewHolder)view.getTag();
}
vHolder.image.setImageResource((Integer) listitems.get(position).get("image"));
vHolder.name.setText((String)listitems.get(position).get("name"));
vHolder.msg.setText((String)listitems.get(position).get("msg"));
vHolder.check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if(arg1){
flag[select]=true;
}else{
flag[select]=false;
}
}
});
vHolder.btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new AlertDialog.Builder(context)
.setTitle((String) listitems.get(select).get("name"))
.setIcon((Integer) listitems.get(select).get("image"))
.setMessage((String) listitems.get(select).get("info"))
.setPositiveButton("确定", null)
.create()
.show();
}
});
return view;
}
}
里面的几个参数,Context上下文,listitems是用来保存所有数据,Map是用来保存一行的数据,引用了图片的id,listContainer //加载布局管理器
LayoutInflater inflater = LayoutInflater.from(context);,flag是用来标记当前有哪些CheckBox被选中,在这个适配器被初始化的时候,新建boolean这个数组,getCount方法不用说,根据当前的行数新建这个boolean数组,getView方法就是设置某一行的函数,这里是把一行里面的所有空间放在一个内部类里面,如果这一行视图==null,需要新建文件视图,先从布局管理器里面加载一行视图,设置到这个新建的内部类的控件上面,然后设置这些控件的一些属性。增加监听事件。
这里是activity_main
<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center_vertical|center_horizontal" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结算"
/>
<ImageView
android:id="@+id/imageView1"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/shoppingcart"
/>
</LinearLayout>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
然后是list_item.xml
<?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="horizontal" >
<ImageView
android:id="@+id/iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:scaleType="centerInside"
android:src="@drawable/cake" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="TextView1" />
<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView2" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right" >
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/check"
android:focusable="false"
/>
<Button
android:id="@+id/btn_detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="详情" />
</LinearLayout>
</LinearLayout>
这里是MainActivity
package com.example.homework_ui4;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private MyAdapter myAdapter;
private List<Map<String,Object>> listitems;
private Button btn;
private Integer[] imageID={R.drawable.cake,R.drawable.cake,R.drawable.cake,R.drawable.cake};
private String[] msg={"蛋糕","草莓","巧克力","辣条"};
private String[] info={"很好吃","很好吃","很好吃","很好吃"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.listview);
listitems=getList();
myAdapter=new MyAdapter(MainActivity.this,listitems);
listView.setAdapter(myAdapter);
btn=(Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String text="你选择了";
int count=0;
boolean[] flag=myAdapter.flag;
for(int i=0;i<flag.length;i++){
if(flag[i]){
if(count==0){
text+=""+msg[i];
count++;
}
else{
text+=","+msg[i];
}
}
}
new AlertDialog.Builder(MainActivity.this)
.setTitle("选购商品详情")
.setMessage(text)
.setPositiveButton("确定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
})
.create()
.show();
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
new AlertDialog.Builder(MainActivity.this)
.setTitle((String) listitems.get(position).get("name"))
.setIcon((Integer) listitems.get(position).get("image"))
.setMessage((String) listitems.get(position).get("info"))
.setPositiveButton("确定", null)
.create()
.show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
final int selectId=position;
new AlertDialog.Builder(MainActivity.this)
.setTitle("删除")
.setMessage("是否确认删除")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
listitems.remove(selectId);
myAdapter.notifyDataSetChanged();
}
})
.setNegativeButton("取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
}
})
.create()
.show();
return true;
}
});
}
private List<Map<String, Object>> getList() {
// TODO Auto-generated method stub
List<Map<String, Object>> lisitem=new ArrayList<Map<String,Object>>();
for(int i=0;i<imageID.length;i++)
{
Map<String,Object> map=new HashMap<String,Object>();
map.put("name","物品名称");
map.put("msg",msg[i]);
map.put("info",info[i]);
map.put("image",imageID[i]);
lisitem.add(map);
}
return lisitem;
}
}
这里设置了一行的点击事件和长按删除的点击事件
顺便再带上AndroidMainfest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.homework_ui4"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.homework_ui4.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>