Java Android GridView,重复项

Java Android GridView,重复项,java,android,gridview,Java,Android,Gridview,我试图用图像视图和文本视图从视图页面填充网格视图。我已经完成了那部分,但我发现了一个bug。问题是,每当我从当前页面切换到第二个页面时,网格视图中的项目都会重复 例如,我的视图寻呼机中有三个页面 佩加 PageB 佩奇 所有页面都有一个带有图像和文本的网格视图。 默认页面是PageA,当我切换到PageC时,PageA网格视图中的所有项目都被复制 下面是我的网格视图适配器的getView()代码,它扩展了BaseAdapter类 @Override public View getView

我试图用图像视图和文本视图从视图页面填充网格视图。我已经完成了那部分,但我发现了一个bug。问题是,每当我从当前页面切换到第二个页面时,网格视图中的项目都会重复

例如,我的视图寻呼机中有三个页面 佩加 PageB 佩奇

所有页面都有一个带有图像和文本的网格视图。 默认页面是PageA,当我切换到PageC时,PageA网格视图中的所有项目都被复制

下面是我的网格视图适配器的getView()代码,它扩展了BaseAdapter类

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

    ViewHolder view;
    LayoutInflater inflater = activity.getLayoutInflater();
    Map<String, String> tempMap = (Map<String, String>) arrList.get(position);
    Log.d("getView()", "convertView = " + convertView);
    Log.d("getView()", "position = " + position);

    imageLoader.clearMemoryCache();

    if(convertView==null)
    {
        view = new ViewHolder();
        convertView = inflater.inflate(R.layout.grid_row, parent, false);
        convertView.setTag(view);
        Log.d("[convertView == null] - " + tempMap.get("KEY_NAME"), view + "");
    }
    else
    {
        view = (ViewHolder) convertView.getTag();
        Log.d("[convertView != null] - " + tempMap.get("KEY_NAME"), view + "");
    }

    Resources r = Resources.getSystem();
    float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250, r.getDisplayMetrics());

    view.textView = (TextView) convertView.findViewById(R.id.textView);
    view.imageView = (ImageView) convertView.findViewById(R.id.imageView);

    view.textView.setText(tempMap.get("KEY_NAME") + " - P" + tempMap.get("KEY_COST"));

    view.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    view.imageView.setLayoutParams(new RelativeLayout.LayoutParams((int)px, (int)px));
    imageLoader.displayImage(tempMap.get("KEY_THUMBURL"), view.imageView, options);

    return convertView;
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
视图持有者视图;
LayoutInflater充气器=活动。getLayoutInflater();
Map tempMap=(Map)arrList.get(position);
Log.d(“getView()”,“convertView=“+convertView”);
Log.d(“getView()”,“position=“+position”);
imageLoader.clearMemoryCache();
if(convertView==null)
{
视图=新的ViewHolder();
convertView=充气机。充气(R.layout.grid_行,父项,false);
setTag(视图);
Log.d(“[convertView==null]-”+tempMap.get(“KEY_NAME”),view+”;
}
其他的
{
view=(ViewHolder)convertView.getTag();
Log.d(“[convertView!=null]-”+tempMap.get(“KEY_NAME”),view+”;
}
Resources r=Resources.getSystem();
float px=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,250,r.getDisplayMetrics());
view.textView=(textView)convertView.findViewById(R.id.textView);
view.imageView=(imageView)convertView.findViewById(R.id.imageView);
view.textView.setText(tempMap.get(“KEY\u NAME”)+“-P”+tempMap.get(“KEY\u COST”);
view.imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
view.imageView.setLayoutParams(新的RelativeLayout.LayoutParams((int)px,(int)px));
imageLoader.displayImage(tempMap.get(“KEY_THUMBURL”)、view.imageView、选项);
返回视图;
}
编辑:

你能进一步解释一下取景器部分吗

这是你要问的代码

    public GridViewAdapter(Activity activity, ArrayList<HashMap<String, String>> argArrList) {
    super();
    this.activity = activity;
    Log.d("GridViewAdapter", "Called constructor");

    options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.ic_stub)
    .showImageForEmptyUri(R.drawable.ic_empty)
    .showImageOnFail(R.drawable.ic_error)
    .cacheInMemory(true)
    .bitmapConfig(Bitmap.Config.RGB_565)
    .build();

    arrList = argArrList;
}

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

@Override
public String getItem(int position) {
    Map<String, String> tempMap = (Map<String, String>) arrList.get(position);
    return tempMap.get("KEY_NAME");
}

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

public static class ViewHolder
{
    public ImageView imageView;
    public TextView textView;
    public GridView gridView;
}
公共GridViewAdapter(活动活动,ArrayList ArrarList){ 超级(); 这个。活动=活动; Log.d(“GridViewAdapter”,“称为构造函数”); 选项=新建DisplayImageOptions.Builder() .showtubimage(R.drawable.ic_存根) .showImageForEmptyUri(R.drawable.ic_empty) .showImageOnFail(R.drawable.ic_错误) .cacheInMemory(真) .bitmapConfig(Bitmap.Config.RGB_565) .build(); arrList=argArrList; } @凌驾 public int getCount(){ 返回arrList.size(); } @凌驾 公共字符串getItem(int位置){ Map tempMap=(Map)arrList.get(position); 返回tempMap.get(“KEY_NAME”); } @凌驾 公共长getItemId(int位置){ 返回0; } 公共静态类视图持有者 { 公共影像视图; 公共文本视图文本视图; 公共网格视图; } 更新


我现在已经解决了这个问题,它不是来自网格视图适配器。它来自使用适配器的片段。我只需要清除我正在使用的数组列表。谢谢大家帮助我。

您没有正确使用视图持有者模式-您总是调用
findViewById()
,但是视图持有者的观点是在不必要的时候防止此类调用。但这不是导致重复的问题。发布代码,其中涉及
getCount()
和可能的
arrList
。已更新帖子。谢谢。您可能向适配器添加了两次项目。我注意到,每次打开页面时,列表大小都会加倍。当您返回到之前查看的同一活动时,您将再次添加相同的项目,而不清除网格。在网格中添加项之前,请先清除该网格视图,然后添加要添加的项。这就是我在代码中所做的