首页 加入收藏

ListView与ArrayAdapter的搭配使用

2013年12月30日 14:08供稿中心: 课工场
摘要:ListView是一种很重要的控件,一般使用时,常建立一个所需类型的ArrayList,再通过ArrayAdapter把ListView绑定到ArrayList上,通过ArrayAdapter来使ListView显示和刷新内容。

在android中,ListView是一种很重要的控件,一般的使用中,常建立一个所需类型的ArrayList,再通过ArrayAdapter把ListView绑定到ArrayList上,通过ArrayAdapter来使ListView显示和刷新内容。

假定现在有一String类型的ArrayList,叫myArrayList,建立ArrayAdapter并将其与myArrayList绑定的代码如下:

ArrayAdapter<String> myArrayAdapter = 
     new ArrayAdapter<String>(this, android.layout.simple_list_item_1, myArrayList);

其中android.layout.simple_list_item_1是android本身的一个基本listview,在实际中也可以自建一个listview。

当有新的内容时,先将String添加到myArrayList,然后通过以下代码完成ListView的刷新显示:

myArrayList.add(0, myString);
myArrayAdapter.notifyDataSetChanged();

上面add方法的第一个参数是新String要添加的位置,从0开始一次递增。notifyDataSetChanged()的作用是告知ListView刷新内容。

在实际中,经常需要定制ListView,先要为所需的页面、边缘等需要的颜色在colors.xml文件中进行设置。并为页面宽度和页面边缘在dimens.xml中添加所需要的值。

然后需要扩展一个新的TextView类,用作ListView中每一行的显示,在init方法中创建获取前面创立的资源文件,并建立Paint对象,然后重写onDraw方法,利用Paint对象来重写图像。

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
    
public class WordItemView extends TextView{
        
    private Paint marginPaint;
    private Paint linePaint;
    private int paperColor;
    private float margin;
        
    //WordItemView的构造函数
    public WordItemView(Context context, AttributeSet ats, int ds){
        super(context, ats, ds);
        init();
    }
        
    public WordItemView(Context context){
        super(context);
        init();
    }
        
    public WordItemView(Context context, AttributeSet ats){
        super(context, ats);
        init();
    }
        
    private void init(){
        Resources myResources = getResources();
            
        //创建画刷
        marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        marginPaint.setColor(myResources.getColor(R.color.margin));
        linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        linePaint.setColor(myResources.getColor(R.color.lines));
            
        //获得页面背景色和边缘宽度
        paperColor = myResources.getColor(R.color.paper);
        margin = myResources.getDimension(R.dimen.margin);
    }
        
    @Override
    public void onDraw(Canvas canvas){
        //绘制页面颜色
        canvas.drawColor(paperColor);
            
        //绘制边缘
        //canvas.drawLine(0, 0, 0, getMeasuredHeight(), linePaint);
        canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);
        canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
            
        //移动文本
        canvas.save();
        canvas.translate(margin, 0);
            
        //渲染文本
        super.onDraw(canvas);
        canvas.restore();
    }
        
}

接下来在res/layout中新建一个xml文件来指定每一个条目在视图列表中的排列方式。

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
        
    <TextView
        android:id="@+id/itemMean"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_alignParentRight="true"
        android:textColor="@color/text"
        android:padding="10dp"
        android:scrollbars="vertical"
        android:fadingEdge="vertical"/>
    
    <com.qingshuimonk.words.WordItemView
        android:id="@+id/itemWord"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp"
        android:scrollbars="vertical"
        android:textColor="@color/text"
        android:textStyle="italic"
        android:fadingEdge="vertical"/>
    
</RelativeLayout>

重写ArrayAdapter方法使其适应现有的空间,在这个例子(一个能显示单词和释义的应用)里,有两个TextView需要显示。

import java.util.List;
    
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
    
public class MyAdapter extends ArrayAdapter<WordItem>{
        
    int resource;
        
    public MyAdapter(Context context, int _resource, List<WordItem> items){
        super(context, _resource, items);
        resource = _resource;
    }
        
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        LinearLayout newView;
            
        WordItem item = getItem(position);
            
        String word = item.getWord();
        String mean = item.getMean();
            
        if(convertView == null){
            newView = new LinearLayout(getContext());
            String inflater = Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater li;
            li = (LayoutInflater)getContext().getSystemService(inflater);
            li.inflate(resource, newView, true);
        }
        else{
            newView = (LinearLayout)convertView;
        }
            
        TextView wordView = (TextView)newView.findViewById(R.id.itemWord);
        TextView meanView = (TextView)newView.findViewById(R.id.itemMean);
            
        wordView.setText(word);
        meanView.setText(mean);
            
        return newView;
    }
        
}

最后在MainActivity里面对ArrayList和ArrayAdapter的绑定代码进行修改。

final ArrayList<WordItem> worditem = new ArrayList<WordItem>();
       final MyAdapter adapter = 
               new MyAdapter(this, R.layout.worditem, worditem);
        wordsList.setAdapter(adapter);

这样定制的ListView就大功告成了。


标签: 安卓 android
  • 相关阅读
你的Android不好用的原因就是这些!2015.08.28
Android Application对象必须掌握的七点2015.08.24
Android 性能调优点2015.08.21
十分钟设置android状态栏一体化开源工程推荐2015.08.17
Android应用中的开机引导界面——用ViewPager实现2015.08.12
  • 全国校区查询
  • 新手入门点击榜
  • 新手入门最新文章
  • 热门标签
关于我们
公司简介
发展历程
青鸟荣誉
联系我们
加入我们
青鸟课程
ACCP
学士后Java
BENET
网络营销
启蒙星IT工程师基础课程
学习客户端下载
青鸟优师
青鸟微讯
学士后Android软件工程师
网络营销师1.0
关注我们
RSS订阅
北大青鸟网络营销学院
北大青鸟学员社区
北大青鸟官方微信
北大青鸟微社区
回顶部 新版反馈 回到首页
官方新版意见收集

*

官方新版意见收集

提交成功,感谢您的反馈。

我们会认真阅读和考虑每个用户的反馈。