Listview的自定义Adapter

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

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);
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值