Listview的自定义Adapter

来源:互联网 发布:网络女主播真实收入 编辑:程序博客网 时间:2024/06/05 09:14

网上关于这方面的好的文章:

http://yilee.info/android-diy-listview.html
http://blog.csdn.net/xiaominghimi/article/details/6314704
http://blog.csdn.net/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);    }}

实现效果:
这里写图片描述

0 0