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之 ListActivity 的使用和在 ListView中添加图片文字

ListActivity简单的说就是ListView和Activity的结合,跟ListView和Activity组合实现的没有什么很大的差别,主要是比较方便。但在实现时,有几点要注意。       ...

Android 中 ListAactivity 和Activity 使用ListView 以及ArrayAdapter和SimpleAdapter参数详解

在使用Activity和ListActivity 上的一些区别   首先看一下ArrayAdapter和SimpleAdapter的参数(参数名有可能不对,按顺序排列的)  *1.ArrayAdapt...
  • sgilec
  • sgilec
  • 2015年08月22日 17:33
  • 614

Android中的使用ListView控件显示List集合中的数据,并对Item响应选择事件(方法一)

item.xml

Android中的使用ListView控件显示List集合中的数据,并对Item响应选择事件(方法二)

本方法,采用继承ListActivity,来实现的,需要注意的是,在配置文件中ListView的ID书写方式@id/android:list 以及在对应的Activity中通过调用setList...

ListView不同的项目布局(item layout)的实现

在上例的list中加入一些分隔线 你需要做这些: 重(@Override)写 getViewTypeCount() – 返回你有多少个不同的布局重写 getItemViewType(int...

android图文混排与多种类型listView的混搭的item的demo,getItemViewType()和getViewTypeCount()的使用

工作中经常遇到一个listView里面的item是不同样式的,以前考虑的是在getView实现不同的样式,那样的话效率应该低,也没有那么方便,下面就把最近新学到的东西整理下。就是图文混排的一个list...

Android ListView ArrayAdapter同时实现列表和按钮点击事件

这个问题找了一下午才找到,网上找了很多都是写的继承BaseAdapter来实现。 老师给留了这个作业,我想完成他。但是初学者困难很多。我把我做得和大家分享一下: 1...

Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter

其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter。还有一种是...
  • qqGrid
  • qqGrid
  • 2014年10月23日 18:35
  • 509
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView加ArrayAdapter结合android.R.layout.activity_list_item快速实现图文显示
举报原因:
原因补充:

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