Java Android GridView,重复项
我试图用图像视图和文本视图从视图页面填充网格视图。我已经完成了那部分,但我发现了一个bug。问题是,每当我从当前页面切换到第二个页面时,网格视图中的项目都会重复 例如,我的视图寻呼机中有三个页面 佩加 PageB 佩奇 所有页面都有一个带有图像和文本的网格视图。 默认页面是PageA,当我切换到PageC时,PageA网格视图中的所有项目都被复制 下面是我的网格视图适配器的getView()代码,它扩展了BaseAdapter类Java Android GridView,重复项,java,android,gridview,Java,Android,Gridview,我试图用图像视图和文本视图从视图页面填充网格视图。我已经完成了那部分,但我发现了一个bug。问题是,每当我从当前页面切换到第二个页面时,网格视图中的项目都会重复 例如,我的视图寻呼机中有三个页面 佩加 PageB 佩奇 所有页面都有一个带有图像和文本的网格视图。 默认页面是PageA,当我切换到PageC时,PageA网格视图中的所有项目都被复制 下面是我的网格视图适配器的getView()代码,它扩展了BaseAdapter类 @Override public View getView
@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
。已更新帖子。谢谢。您可能向适配器添加了两次项目。我注意到,每次打开页面时,列表大小都会加倍。当您返回到之前查看的同一活动时,您将再次添加相同的项目,而不清除网格。在网格中添加项之前,请先清除该网格视图,然后添加要添加的项。这就是我在代码中所做的