ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果。
有这样一个Demo ,实现图片文字混合列表。
package com.example.work; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.R.integer; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class MainActivity extends Activity { private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview = (ListView) findViewById(R.id.id_list); //这里设置三个列表项,每个列表项对应一个图片和对应的文字 //图片数组 int image[] = new int[]{R.drawable.tou1,R.drawable.tou3,R.drawable.he}; //文字数组 String text[] = {"连连看","斗地主","爱消除"}; List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>(); //将一个图片和一个文字放入一个map集合中,并将map集合依次加入到list集合中 for(int i=0;i<image.length;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("text", text[i]); map.put("image", image[i]); list.add(map); } //MyAdapter是自定义的适配器 MyAdapter myadapter = new MyAdapter(this, R.layout.layout_item, list); listview.setAdapter(myadapter); //点击列表项的响应事件 listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "点击了第"+(arg2+1)+"项,内容:"+arg0.getItemAtPosition(arg2).toString(), 1).show(); } }); } } MainActivity
自定义适配器:
package com.example.work; import java.util.ArrayList; import java.util.HashMap; 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.ImageView; import android.widget.TextView; public class MyAdapter extends BaseAdapter{ private Context context;//上下文 private int resourceId;//列表项的布局文件 private List<HashMap<String, Object>> list; //数据源 public MyAdapter(Context context,int resourceId,List<HashMap<String,Object>> list) { this.context = context; this.resourceId = resourceId; this.list = list; } //得到列表项的个数,即数据源的数据条数 @Override public int getCount() { int count = 0; if(list!=null) return list.size(); return count; } //得到对应position位置列表项的内容,即数据源list对应位置的数据 @Override public Object getItem(int position) { return list.get(position); } //得到列表项的id @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub //提高对对象的复用 View view = null; if(convertView!=null) { view = convertView; } else { view = LayoutInflater.from(context).inflate(resourceId, parent,false); } ViewHolder holder = (ViewHolder) view.getTag(); if(holder==null) { holder = new ViewHolder(); holder.textView = (TextView) view.findViewById(R.id.id_textview); holder.image = (ImageView) view.findViewById(R.id.id_image); view.setTag(holder); } //给相应位置的图片和文字赋内容 holder.textView.setText(list.get(position).get("text").toString()); holder.image.setImageResource((Integer) list.get(position).get("image")); //返回视图,这里的视图是一整个列表项的视图 return view; } class ViewHolder { TextView textView; ImageView image; } }
主Activity布局文件:
<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" tools:context=".MainActivity" > <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/id_list" ></ListView> </LinearLayout>
列表项布局:
<?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:layout_width="50dp" android:layout_height="50dp" android:id="@+id/id_image" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/id_textview" android:gravity="center_vertical" android:textStyle="bold|italic" /> </LinearLayout>
效果图: