Android 自定义GridView的位置错误

Android 自定义GridView的位置错误,android,gridview,Android,Gridview,我创建了一个自定义的GridView。它可以工作,但是i在日志中显示了错误的位置 日志输出为0,1,2,00,1,2,3,4,5 在我的GridView中,所有元素都存在,但第三个元素之后的标题和图像错误 当我点击元素时,我得到了正确的索引 我是Android新手。是否有缓存或我必须清理GridView?我发现了很多类似的线索,但没有人能帮上忙。如果你需要更多的代码,请让我知道 public View getView(int i, View convertView, ViewGroup pare

我创建了一个自定义的GridView。它可以工作,但是
i
在日志中显示了错误的位置

日志输出为
0,1,2,0
0,1,2,3,4,5 在我的GridView中,所有元素都存在,但第三个元素之后的标题和图像错误

当我点击元素时,我得到了正确的索引

我是Android新手。是否有缓存或我必须清理GridView?我发现了很多类似的线索,但没有人能帮上忙。如果你需要更多的代码,请让我知道

public View getView(int i, View convertView, ViewGroup parent) {
    View gridViewAndroid;
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    if (convertView == null) {

        gridViewAndroid = new View(mContext);
        gridViewAndroid = inflater.inflate(R.layout.course, null);

        TextView textViewAndroid = (TextView) gridViewAndroid.findViewById(R.id.android_gridview_text);
        ImageView imageViewAndroid = (ImageView) gridViewAndroid.findViewById(R.id.android_gridview_image);

        String url = "xxx/" + courses.get(i).getImageName();
        Picasso.with(mContext).load(url).into(imageViewAndroid);
        Log.d("IMAGE", "i" + i);
        textViewAndroid.setText(courses.get(i).getName());
    } else {
        gridViewAndroid = (View) convertView;
    }

    return gridViewAndroid;
}

你的观点是循环的,这就是为什么这个问题发生的原因。试试下面的代码

public View getView(int i, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {   
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         convertView = inflater.inflate(R.layout.course, null);
         holder = new ViewHolder();
         holder.textViewAndroid = (TextView) convertView.findViewById(R.id.android_gridview_text);

         holder.imageViewAndroid = (ImageView) convertView.findViewById(R.id.android_gridview_image);
         convertView.setTag(holder);
    } else {
         holder = (ViewHolder) convertView.getTag();
    }

   String url = "xxx/" + courses.get(i).getImageName();
   Picasso.with(mContext).load(url).into(holder.imageViewAndroid);
   Log.d("IMAGE", "i" + i);
   holder.textViewAndroid.setText(courses.get(i).getName());
   return convertView;
}
在适配器内添加视图保持架

static class ViewHolder {
     TextView textViewAndroid;
     ImageView imageViewAndroid;
}
getView()
更改为下面的代码

public View getView(int i, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {   
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         convertView = inflater.inflate(R.layout.course, null);
         holder = new ViewHolder();
         holder.textViewAndroid = (TextView) convertView.findViewById(R.id.android_gridview_text);

         holder.imageViewAndroid = (ImageView) convertView.findViewById(R.id.android_gridview_image);
         convertView.setTag(holder);
    } else {
         holder = (ViewHolder) convertView.getTag();
    }

   String url = "xxx/" + courses.get(i).getImageName();
   Picasso.with(mContext).load(url).into(holder.imageViewAndroid);
   Log.d("IMAGE", "i" + i);
   holder.textViewAndroid.setText(courses.get(i).getName());
   return convertView;
}

将静态类放在您的
公共类X扩展BaseAdapter

视图被回收,这就是发生此问题的原因。试试下面的代码

public View getView(int i, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {   
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         convertView = inflater.inflate(R.layout.course, null);
         holder = new ViewHolder();
         holder.textViewAndroid = (TextView) convertView.findViewById(R.id.android_gridview_text);

         holder.imageViewAndroid = (ImageView) convertView.findViewById(R.id.android_gridview_image);
         convertView.setTag(holder);
    } else {
         holder = (ViewHolder) convertView.getTag();
    }

   String url = "xxx/" + courses.get(i).getImageName();
   Picasso.with(mContext).load(url).into(holder.imageViewAndroid);
   Log.d("IMAGE", "i" + i);
   holder.textViewAndroid.setText(courses.get(i).getName());
   return convertView;
}
在适配器内添加视图保持架

static class ViewHolder {
     TextView textViewAndroid;
     ImageView imageViewAndroid;
}
getView()
更改为下面的代码

public View getView(int i, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {   
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

         convertView = inflater.inflate(R.layout.course, null);
         holder = new ViewHolder();
         holder.textViewAndroid = (TextView) convertView.findViewById(R.id.android_gridview_text);

         holder.imageViewAndroid = (ImageView) convertView.findViewById(R.id.android_gridview_image);
         convertView.setTag(holder);
    } else {
         holder = (ViewHolder) convertView.getTag();
    }

   String url = "xxx/" + courses.get(i).getImageName();
   Picasso.with(mContext).load(url).into(holder.imageViewAndroid);
   Log.d("IMAGE", "i" + i);
   holder.textViewAndroid.setText(courses.get(i).getName());
   return convertView;
}

将静态类放入您的
公共类X扩展BaseAdapter

convertView将循环使用。将日志从if-else语句中移出,并检查positionconvertView是否将循环使用。将日志移出if-else语句并检查位置