android - 使用 ViewHolder 的 ListActivty 的 BaseAdapter.getView() - Android

标签 android listview baseadapter

这是我最初用于 ListView BaseAdapter 的 getView 方法:

    // create a new ImageView for each item referenced by the Adapter
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {  // if it's not recycled, initialize some attributes
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
                imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                imageView.setPadding(8, 8, 8, 8);
            } else {
                imageView = (ImageView) convertView;
            }

            ImageHelper ih = new ImageHelper();



imageView.setImageBitmap(ih.decodeSampledBitmapFromResource(mContext.getResources(), mList.get(position), 40, 40));

            return imageView;
        }

它没有使用 convertView,我也没有 mInflater。我读到这种方式不利于内存使用,我找到了一种使用 ViewHolder 的更好方式。我已更改此方法以实现 viewHolder 并使用 convertView 而不是像我最初那样制作 ImageView:

static class ViewHolder{
        TextView text;
        ImageView icon;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
              ViewHolder holder;
              ImageView imageView = new ImageView(mContext);
              ImageHelper ih = new ImageHelper();
              if (convertView == null) {
              convertView = mInflater.inflate(R.id.gridviewViewOutfits, null);

              holder = new ViewHolder();
              holder.icon = (ImageView) convertView;
              holder.icon.setLayoutParams(new GridView.LayoutParams(150, 150));
              holder.icon.setScaleType(ImageView.ScaleType.FIT_CENTER);
              holder.icon.setPadding(8, 8, 8, 8);

              convertView.setTag(holder);
              } else {
              holder = (ViewHolder) convertView.getTag();
              }

              holder.icon.setImageBitmap(ih.decodeSampledBitmapFromResource(mContext.getResources(), mList.get(position), 40, 40));

              return convertView;
              }

此行导致 nullPointerException:convertView = mInflater.inflate(R.id.gridviewViewObjects, null);

这是因为我没有实例化我的 mInflater。然后我这样做了:mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

因为我在网上看到的。然后我得到了这个错误:

01-20 20:37:52.080: E/AndroidRuntime(22543): FATAL EXCEPTION: main
01-20 20:37:52.080: E/AndroidRuntime(22543): android.content.res.Resources$NotFoundException: Resource ID #0x7f04002b type #0x12 is not valid
01-20 20:37:52.080: E/AndroidRuntime(22543):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2136)
01-20 20:37:52.080: E/AndroidRuntime(22543):    at android.content.res.Resources.getLayout(Resources.java:865)
01-20 20:37:52.080: E/AndroidRuntime(22543):    at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
01-20 20:37:52.080: E/AndroidRuntime(22543):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
01-20 20:37:52.080: E/AndroidRuntime(22543):    at com.btf271.imagehelper.ChooseStickersImageAdapter.getView(ChooseObjectsImageAdapter.java:136)

我应该如何实例化 mInflater,或者我是否充气错误?

这是我的 ListActivity 的 XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".ViewOutfitsActivity" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

    <GridView
        android:id="@+id/gridviewViewObjects"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:columnWidth="90dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="columnWidth"
        android:gravity="center"
    />

</RelativeLayout>

谢谢。

最佳答案

此时当你有膨胀的 View 时,你应该使用布局

所以改变一下

 convertView = mInflater.inflate(R.id.gridviewViewOutfits, null);

  convertView = mInflater.inflate(R.layout.gridviewViewOutfits, null);

关于android - 使用 ViewHolder 的 ListActivty 的 BaseAdapter.getView() - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21228704/

相关文章:

android - 在Titanium中,如何从android中的视频中获取缩略图?

java - 解析带有格式标签的字符串

android - Firebase 仪表板不显示价格值

java - 从ListView到RecyclerView

android - 如何使用自定义 View 中的按钮从 ListView 中删除自定义 View

android - 如何维护Listview中高亮的点击项?

android - 在 ListView 内的 ListView 中重用(或在适配器内的适配器)

android - 如何在动画期间摆脱这个黑条?

java - 为什么我的自定义 GridView 仅显示一列?

android - 两个 Listview(具有不同布局)只能与一个 customAdapter 一起使用吗?是否可以?