网上关于这方面的好的文章:
http://yilee.info/android-diy-listview.html
http://blog.youkuaiyun.com/xiaominghimi/article/details/6314704
http://blog.youkuaiyun.com/chenzheng_java/article/details/6202586#
或许你可能有疑问,不是安卓为我们提供了Baseadapter, simpleadapter,ArrayAdapter三种适配器了,为什么我们还需要自己写设配器尼,这是因为我们在实际的项目中,又可以遇到在一个item中含有button按钮,多选框等控件,这就需要在item里面设置多个点击事件,而使用上面的适配无法实现这种效果,就需要我们使用自己定义的适配器。
java代码:
public class myadapter extends BaseAdapter {
private List<HashMap<String, Object>> listitem=new ArrayList<HashMap<String, Object>>();
private View contentview; //用来缓存加载进来的视图
private int layoutId; //listview的单个item文件
public Context context; //用来获取传递进来的上下文
public class listview{ //用来缓存单个item文件中的资源控件
ImageView imageview;
TextView textview;
Button button;
}
public myadapter(Context context,int layoutId,List<HashMap<String, Object>> listitem) {
// TODO Auto-generated constructor stub
this.context=context;
this.layoutId=layoutId;
this.listitem=listitem;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.i("123", (String) listitem.get(position).get("textview"));
View view;
listview data=null;
/*
* 在下面我们通过判断contentview是否为空,来决定是不是需要加载布局,通过构造了一个listview类保存从布局中获取的
* 资源控件,并通过view.setTag()函数保存起来
*
* convertView是旧View(这里不便翻译有的人翻成视图)的重用
*
* 其实到此为止我们可以总结出convertview的机制了,就是在初始显示的时候,
* 每次显示一个item都调用一次getview方法但是每次调用的时候covertview为空(因为还没有旧的view),
* 当显示完了之后。如果屏幕移动了之后,并且导致有些Item(也可以说是view)跑到屏幕外面,
* 此时如果还有新的item需要产生,则这些item显示时调用的getview方法中的convertview参数就不是null,
* 而是那些移出屏幕的view(旧view),我们所要做的就是将需要显示的item填充到这些回收的view(旧view)中去,
* 最后注意convertview为null的不仅仅是初始显示的那些item,还有一些是已经开始移入屏幕但是还没有view被回收的那些item。
*/
if(convertView==null)
{
data=new listview();
view=LayoutInflater.from(context).inflate(layoutId, null);
data.imageview=(ImageView)view.findViewById(R.id.imageview);
data.textview=(TextView)view.findViewById(R.id.textview);
data.button=(Button)view.findViewById(R.id.button);
view.setTag(data);
}else
{
view=convertView;
data=(listview) view.getTag();
}
// data.imageview.setBackgroundResource((int) listitem.get(position).get("imageview"));
// data.textview.setText((CharSequence) listitem.get(position).get("textview"));
data.imageview.setBackgroundResource(R.drawable.ic_launcher);
data.textview.setText("123");
data.button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context, "123", Toast.LENGTH_SHORT).show();
}
});
return view;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listitem.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
}
listview单个item.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageview"
android:src="@drawable/ic_launcher"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
/>s
<TextView
android:id="@+id/textview"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="123"
/>
<Button
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="click"
android:layout_marginLeft="50dp"
/>
</LinearLayout>
主活动Mainactivity
public class mainActivity extends Activity {
private List<HashMap<String, Object>> listitem=new ArrayList<HashMap<String, Object>>();
private ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.listview);
listview=(ListView)findViewById(R.id.mylistview);
init_data();
myadapter adapter=new myadapter(getApplicationContext(), R.layout.listview_item, listitem);
listview.setAdapter(adapter);
}
void init_data()
{
HashMap<String, Object> item=new HashMap<String,Object>();
item.put("imageview", R.drawable.ic_launcher);
item.put("textview", "123");
listitem.add(item);
HashMap<String, Object> item1=new HashMap<String,Object>();
item1.put("imageview", R.drawable.ic_launcher);
item1.put("textview", "456");
listitem.add(item1);
HashMap<String, Object> item2=new HashMap<String,Object>();
item2.put("imageview", R.drawable.ic_launcher);
item2.put("textview", "789");
listitem.add(item2);
}
}
实现效果: