Android 获取错误的图像索引

Android 获取错误的图像索引,android,typedarray,Android,Typedarray,array.xml <?xml version="1.0" encoding="utf-8"?> <resources> <integer-array name="animal"> <item>@drawable/animal1</item> <item>@drawable/animal10</item> <item>@drawable/anim

array.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer-array name="animal">
        <item>@drawable/animal1</item>
        <item>@drawable/animal10</item>
        <item>@drawable/animal100</item>
        <item>@drawable/animal101</item>
        <item>@drawable/animal102</item>
        <item>@drawable/animal103</item>
        <item>@drawable/animal104</item>
        <item>@drawable/animal105</item>
        <item>@drawable/animal106</item>
        <item>@drawable/animal107</item>
        <item>@drawable/animal108</item>
        <item>@drawable/animal109</item>
        <item>@drawable/animal11</item>
        <item>@drawable/animal110</item>
    </integer-array>
</resources>
现在检索资源Id并存储到ArrayList中的整数如下

ArrayList<Integer> myImageList = new ArrayList<>();
for(int i=0; i<mystikers.length(); i++){
    myImageList.add(imgs.getResourceId(i, -1));
}
如果我使用recycle()来回收图像(TypedArray)

出现错误的gridview适配器

public class StikAdpter extends BaseAdapter {
    private Context mContext;

    int size=0;
    ArrayList<Integer> img_List = new ArrayList<>();
    ArrayList<Integer> myImageList22 = new ArrayList<>();

    public StikAdpter(Context c,ArrayList<Integer> img_Detail_List,TypedArray mystikerishere){
        mContext= c;
        img_List=img_Detail_List;
        size = img_List.size();
        Log.v("count",String.valueOf(size));
        for(int i=0; i<mystikerishere.length(); i++){
            myImageList22.add(mystikerishere.getResourceId(i, -1));
            Log.v("allimages",img_List.get(i)+"");
        }
        mystikerishere.recycle();
    }
    @Override
    public int getCount() {
        return size;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View gridView1;

        if (convertView == null) {
            gridView1 = new View(mContext);

            // get layout from mobile.xml
            gridView1 = inflater.inflate(R.layout.grid_items, null);

            // set image based on selected text
            ImageView imageView = (ImageView) gridView1
                    .findViewById(R.id.grid_item_image);

            Glide.with(mContext)
                    .load(myImageList22.get(position))
                    .override(150, 150)
                    .into(imageView);
            gridView1.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 200));
        }else {
            gridView1 = (View) convertView;
        }

        return gridView1;
    }
}
公共类StikAdpter扩展BaseAdapter{
私有上下文;
int size=0;
ArrayList img_List=新建ArrayList();
ArrayList myImageList22=新的ArrayList();
公共StikAdpter(上下文c,数组列表img_Detail_List,类型Darray Mystikerisher){
mContext=c;
img_列表=img_明细表;
size=img_List.size();
Log.v(“count”,String.valueOf(size));

对于(int i=0;i请尝试下面的代码,将其与您现有的代码进行比较,并询问我您是否会感到困惑

public class StikAdpter extends BaseAdapter {
    private Context mContext;

    ArrayList<Integer> myImageList22 = new ArrayList<>();

    public StikAdpter(Context c, ArrayList<Integer> img_Detail_List, TypedArray mystikerishere) {
        mContext = c;
        for (int i = 0; i < mystikerishere.length(); i++) {
            myImageList22.add(mystikerishere.getResourceId(i, -1));
        }
        mystikerishere.recycle();
    }

    @Override
    public int getCount() {
        return myImageList22.size();
    }

    @Override
    public Object getItem(int position) {
        return myImageList22.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View gridView1;
        ImageView imageView;
        if (convertView == null) {
            gridView1 = new View(mContext);
            // get layout from mobile.xml
            gridView1 = inflater.inflate(R.layout.grid_items, null);
            imageView = (ImageView) gridView1
                    .findViewById(R.id.grid_item_image);

            // set image based on selected text
            gridView1.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 200));
        } else {
            gridView1 = (View) convertView;
        }


        Glide.with(mContext)
                .load(myImageList22.get(position))
                .override(150, 150)
                .into(imageView);

        return gridView1;
    }
}
公共类StikAdpter扩展BaseAdapter{
私有上下文;
ArrayList myImageList22=新的ArrayList();
公共StikAdpter(上下文c,数组列表img_Detail_List,类型Darray Mystikerisher){
mContext=c;
for(int i=0;i
请尝试下面的代码,将其与您现有的代码进行比较,并询问我您是否会感到困惑

public class StikAdpter extends BaseAdapter {
    private Context mContext;

    ArrayList<Integer> myImageList22 = new ArrayList<>();

    public StikAdpter(Context c, ArrayList<Integer> img_Detail_List, TypedArray mystikerishere) {
        mContext = c;
        for (int i = 0; i < mystikerishere.length(); i++) {
            myImageList22.add(mystikerishere.getResourceId(i, -1));
        }
        mystikerishere.recycle();
    }

    @Override
    public int getCount() {
        return myImageList22.size();
    }

    @Override
    public Object getItem(int position) {
        return myImageList22.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View gridView1;
        ImageView imageView;
        if (convertView == null) {
            gridView1 = new View(mContext);
            // get layout from mobile.xml
            gridView1 = inflater.inflate(R.layout.grid_items, null);
            imageView = (ImageView) gridView1
                    .findViewById(R.id.grid_item_image);

            // set image based on selected text
            gridView1.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 200));
        } else {
            gridView1 = (View) convertView;
        }


        Glide.with(mContext)
                .load(myImageList22.get(position))
                .override(150, 150)
                .into(imageView);

        return gridView1;
    }
}
公共类StikAdpter扩展BaseAdapter{
私有上下文;
ArrayList myImageList22=新的ArrayList();
公共StikAdpter(上下文c,数组列表img_Detail_List,类型Darray Mystikerisher){
mContext=c;
for(int i=0;i
请在出现此错误的地方张贴您的方法。如果我使用mystikerisher.recycle();如果我删除mystikerisher.recycle(),我会在出现错误的地方添加adpter代码;我得到了错误的图像和多个图像我的意思是同一图像在我的GridView中重复多次我不知道你为什么把代码弄糟了!你没有使用holder模式,你膨胀网格的方式?请关注一些好的博客。请在你得到这个错误的地方发布你的方法。我在使用mysti时出错的地方添加了adpter代码Kerisher.recycle();如果我删除Mystikerisher.recycle();我会得到错误的图像和多个图像我的意思是同一个图像在我的GridView中重复多次我不知道你为什么把代码弄糟了!你没有使用holder模式,你膨胀网格的方式?请关注一些好的博客。
java.lang.RuntimeException: Cannot make calls to a recycled instance!
public class StikAdpter extends BaseAdapter {
    private Context mContext;

    int size=0;
    ArrayList<Integer> img_List = new ArrayList<>();
    ArrayList<Integer> myImageList22 = new ArrayList<>();

    public StikAdpter(Context c,ArrayList<Integer> img_Detail_List,TypedArray mystikerishere){
        mContext= c;
        img_List=img_Detail_List;
        size = img_List.size();
        Log.v("count",String.valueOf(size));
        for(int i=0; i<mystikerishere.length(); i++){
            myImageList22.add(mystikerishere.getResourceId(i, -1));
            Log.v("allimages",img_List.get(i)+"");
        }
        mystikerishere.recycle();
    }
    @Override
    public int getCount() {
        return size;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View gridView1;

        if (convertView == null) {
            gridView1 = new View(mContext);

            // get layout from mobile.xml
            gridView1 = inflater.inflate(R.layout.grid_items, null);

            // set image based on selected text
            ImageView imageView = (ImageView) gridView1
                    .findViewById(R.id.grid_item_image);

            Glide.with(mContext)
                    .load(myImageList22.get(position))
                    .override(150, 150)
                    .into(imageView);
            gridView1.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 200));
        }else {
            gridView1 = (View) convertView;
        }

        return gridView1;
    }
}
public class StikAdpter extends BaseAdapter {
    private Context mContext;

    ArrayList<Integer> myImageList22 = new ArrayList<>();

    public StikAdpter(Context c, ArrayList<Integer> img_Detail_List, TypedArray mystikerishere) {
        mContext = c;
        for (int i = 0; i < mystikerishere.length(); i++) {
            myImageList22.add(mystikerishere.getResourceId(i, -1));
        }
        mystikerishere.recycle();
    }

    @Override
    public int getCount() {
        return myImageList22.size();
    }

    @Override
    public Object getItem(int position) {
        return myImageList22.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View gridView1;
        ImageView imageView;
        if (convertView == null) {
            gridView1 = new View(mContext);
            // get layout from mobile.xml
            gridView1 = inflater.inflate(R.layout.grid_items, null);
            imageView = (ImageView) gridView1
                    .findViewById(R.id.grid_item_image);

            // set image based on selected text
            gridView1.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 200));
        } else {
            gridView1 = (View) convertView;
        }


        Glide.with(mContext)
                .load(myImageList22.get(position))
                .override(150, 150)
                .into(imageView);

        return gridView1;
    }
}