重写Adapter类

有时需要对ListView中的每个Item进行个性化,下面是个简单的例子。其中最重要的ArrayAdapter中的getView()方法的重写,参考了android中ArrayAdapter中的源码。

代码

1.首先是Layout,一个是主界面mian.xml,另一个是ListView中的单独的条目imagelayout.xml。代码如下:

★1 main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ListView        <!--※ 需要一个ListView -->
    android:id= "@+id/listview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
</LinearLayout>

★2 imagelayout.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/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
    <TextView 
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

2.重写Adapter代码

public class DemoAdapter extends ArrayAdapter<String> {
    private LayoutInflater mInflater;//★需要一个LayoutInflater来调整ListView中的LinearLayout
    public DemoAdapter(Context context, int textViewResourceId,List<String> list) {
        super(context, textViewResourceId,list);
        // TODO Auto-generated constructor stub
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//★
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        //return super.getView(position, convertView, parent);
        LinearLayout lv;
        TextView tv;
        if (convertView == null) {
            lv = (LinearLayout) mInflater.inflate(R.layout.imagelayout,  parent, false);//相当于new一个新的对象
            //lv = new LinearLayout(getContext()); 
            //mInflater.inflate(R.layout.imagelayout,lv,true);
        } else {
            lv = (LinearLayout) convertView;
        }

         String item = (String) getItem(position);

         tv = (TextView) lv.findViewById(R.id.textView1);    
         tv.setText(item);   
        return lv;//返回LinearLayout
    }

}

3.主程序中运行

public class mainActivity extends Activity {
    /** Called when the activity is first created. */
    private ListView lv;
    private List<String> ls;
    private ArrayAdapter<String> adp;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lv = (ListView)findViewById(R.id.listview);

        ls = new ArrayList<String>();
        ls.add("one");
        ls.add("two");
        ls.add("three");

        adp = new DemoAdapter(this,R.layout.imagelayout,ls);
        //adp = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,ls);

        lv.setAdapter(adp);
    }
}

结果如下图
adapter

总结

在写这个例子的过程中碰到了一些问题
1.需要一个ListView对象
2.如果ListView中显示的东西较复杂,要一个LinearLayout,将要显示的东西方总LinearLayout中
3.getView()中,最重要的是new 一个LinearLayout对象。这里参考了android源码用了mInflater.inflate(),其实也可以用lv = new LinearLayout(getContext()); 的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,我们通常使用 Adapter 来实现 ListView、GridView 等控件的数据绑定。重写 Adapter 的目的是为了实现自定义的数据绑定逻辑。 重写 Adapter 需要继承 BaseAdapter,然后实现以下方法: 1. getCount():获取数据源的总数。 2. getItem():获取指定位置的数据项。 3. getItemId():获取指定位置的数据项的 ID。 4. getView():获取指定位置的数据项的视图。 在实现 getView() 方法时,我们需要使用 LayoutInflater 来加载自定义的布局文件,并将数据绑定到布局中的控件上。例如: ``` @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.my_list_item, null); holder = new ViewHolder(); holder.title = (TextView) convertView.findViewById(R.id.title); holder.content = (TextView) convertView.findViewById(R.id.content); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } MyData data = dataList.get(position); holder.title.setText(data.getTitle()); holder.content.setText(data.getContent()); return convertView; } static class ViewHolder { TextView title; TextView content; } ``` 在上面的代码中,我们使用了 ViewHolder 模式来提高 ListView 的性能。同时,在 getView() 方法中,我们将 MyData 型的数据绑定到了自定义的布局文件 my_list_item.xml 中的控件上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值