这是我最初用于 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/