ListView加ArrayAdapter结合android.R.layout.activity_list_item快速实现图文显示

原创 2016年08月30日 13:09:18

核心代码如下:

ArrayAdapter<ResolveInfo> adapter=new ArrayAdapter<ResolveInfo>(getActivity(),
        android.R.layout.activity_list_item,android.R.id.text1,activities){
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        PackageManager pm=getActivity().getPackageManager();
        View view=super.getView(position, convertView, parent);
        TextView tv= (TextView) view.findViewById(android.R.id.text1);

        tv.setText(getItem(position).loadLabel(pm));
        ImageView imageView= (ImageView) view.findViewById(android.R.id.icon);
        imageView.setImageDrawable(getItem(position).loadIcon(pm));
        return view;
    }
};

activity_list_item:该文件由android系统提供,直接使用即可

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="1dip"
    android:paddingBottom="1dip"
    android:paddingStart="8dip"
    android:paddingEnd="8dip">

    <ImageView android:id="@+id/icon"
        android:layout_width="24dip"
        android:layout_height="24dip"/>

    <TextView android:id="@android:id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart" />
</LinearLayout>
从代码中看出适合显示一张图片和一个文本

再看看ArrayAdapter,为什么在本例中选择下面这个构造方法

public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId,
        @NonNull List<T> objects) {。。。。。。。}
因为重写ArrayAdapter的getview()时,执行了父类的方法,父类的getview()具体实现如下:

public View getView(int position, View convertView, ViewGroup parent) {
    return createViewFromResource(mInflater, position, convertView, parent, mResource);
}

private View createViewFromResource(LayoutInflater inflater, int position, View convertView,
        ViewGroup parent, int resource) {
    View view;
    TextView text;

    if (convertView == null) {
        view = inflater.inflate(resource, parent, false);
    } else {
        view = convertView;
    }

    try {
        if (mFieldId == 0) {
            //  If no custom field is assigned, assume the whole resource is a TextView
            text = (TextView) view;
        } else {
            //  Otherwise, find the TextView field within the layout
            text = (TextView) view.findViewById(mFieldId);
        }
    } catch (ClassCastException e) {
        Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
        throw new IllegalStateException(
                "ArrayAdapter requires the resource ID to be a TextView", e);
    }

    T item = getItem(position);
    if (item instanceof CharSequence) {
        text.setText((CharSequence)item);
    } else {
        text.setText(item.toString());
    }

    return view;
}
看红色部分的说明,如果mFieldId=0,就认为整个资源是个TextView,那么这个mFieldId是什么呢?经过查找,初值为0,另外只在上面的构造函数中赋值

mFieldId = textViewResourceId;
是一个textView的索引,显然activity_list_item是个线性布局,不是TextView,所以mFieldId不能等于0,所以需要给mFieldId赋值,所以只能用这个构造函数。另外源代码对mFieldId也做了说明:

If the inflated resource is not a TextView, {@link #mFieldId} is used to find
* a TextView inside the inflated views hierarchy. This field must contain the
* identifier that matches the one defined in the resource file.





Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)

Android UI学习 - ListView  2010-06-20 18:21:35  标签:Android  UI 移动开发 ListView  ListActivity    原创作品...
  • zhoumingsong123
  • zhoumingsong123
  • 2015年09月30日 22:05
  • 7025

Android ArrayAdapter的使用

ArrayAdapter 本想偷偷懒,直接调用下别人翻译的api文档,自己直接写个例子上来,可找了半天还是没有找到翻译好的,算了只能自己动手了。(有找到可以给个地址) 先来看看对ArrayAdap...
  • u012077817
  • u012077817
  • 2015年11月11日 13:59
  • 4287

setContentView(R.layout.activity_main) Error解决方法

今天在写Android代码的过程中,编译器一直报错,错误出在这一行代码: setContentView(R.layout.activity_main) 提示信息是: activity_mai...
  • leilu2008
  • leilu2008
  • 2013年03月08日 14:23
  • 35516

Android系统布局——自带的布局android.R.layout详解

布局文件,作为android中必不可少的一部分,android系统为了方便开发人员,在系统中定义了很多的布局文件。 系统布局文件和我们自定义的布局在写法用前缀android以示区别: 系统布局文件...
  • yangzhaomuma
  • yangzhaomuma
  • 2015年11月17日 00:37
  • 15170

Android学习笔记(十一):Activity-ListView

在手机中经常有列表方式。如果Activity中只有唯一一个List(这也是通常的情况),可以继承ListActivity来实现。我们用两个例子来学习List。 List例子一:利用Android...
  • flowingflying
  • flowingflying
  • 2011年03月17日 16:39
  • 48148

arrayadapter使用出错求大神解答

package com.example.androidpostswapping; import android.app.Activity; import android.os.Bundle; i...
  • u011105400
  • u011105400
  • 2014年06月07日 23:27
  • 878

You must supply a resourceID for a TextView

问题: 新手在初次接触ListView时候喜欢采用简单的ArrayAdpter,由于布局文件xml书写不正确,经常会出现You must supply a resourceID for a Te...
  • qi_ruihua
  • qi_ruihua
  • 2014年11月18日 10:42
  • 1666

ListView的三大适配器ArrayAdapter,SimpleAdapter,MyAdapter

ArrayAdapter是一个只在列表项ListItem上显示TextView的适配器。(其实在列表项上可以有其他组件,在后面会介绍)我们来看一下其构造函数。 public ArrayAdapter...
  • u010852801
  • u010852801
  • 2015年04月16日 18:18
  • 2315

android系统自带的适配布局activity_list_item

理想:注册页面,信息填写后,跳转到另外一个activity 结果:一点注册,app就闪退 日志显示:java.lang.IllegalStateException: ArrayAdapter re...
  • change_for_you
  • change_for_you
  • 2016年09月23日 14:32
  • 298

ListView加ArrayAdapter结合android.R.layout.activity_list_item快速实现图文显示

核心代码如下: ArrayAdapter adapter=new ArrayAdapter(getActivity(), android.R.layout.activity_li...
  • daqi1983
  • daqi1983
  • 2016年08月30日 13:09
  • 511
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView加ArrayAdapter结合android.R.layout.activity_list_item快速实现图文显示
举报原因:
原因补充:

(最多只允许输入30个字)