uso studio propiedades imagenes gridlayout example descargar con android button gridview recycle

studio - Android: diferentes elementos en GridView no aparecen



propiedades gridview android (2)

Estoy trabajando en la aplicación que tiene una GridView de imágenes, pero el último elemento en GridView es un botón que carga más elementos en Grid. Pero me enfrento a un problema extraño y ese es el botón que aparece en algún momento y en algún momento no lo hace especialmente cuando me desplazo hacia arriba y hacia abajo muy rápido en GridView. Creo que es por un problema de reciclaje, pero no sé cómo solucionarlo.

Aquí está mi código:

public class ButtonGridAdapter extends BaseAdapter implements OnCheckedChangeListener, OnClickListener { private ArrayList<String> thumbUrls; private ArrayList<String> mainUrls; private LayoutInflater layoutInflater; private Context context; private Intent intent; private ArrayList<String> positions = new ArrayList<String>(); private static ArrayList<String> urlsToUpload = new ArrayList<String>(); private int width; public ButtonGridAdapter(Context context, ArrayList<String> thumbUrls, ArrayList<String> mainUrls, String clicked) { this.context = context; this.thumbUrls = thumbUrls; this.mainUrls = mainUrls; intent = new Intent(context, GalleryView.class); this.layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); DisplayMetrics displaymetrics = new DisplayMetrics(); ((Activity) context).getWindow().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); this.width = displaymetrics.widthPixels; System.out.println(width+" width"); } @Override public int getCount() { return thumbUrls.size()+1; } @Override public Object getItem(int arg0) { return thumbUrls.get(arg0); } @Override public long getItemId(int position) { return position; } public static class ViewHolder { ImageView mainImage; CheckBox checkBox; Button button; } public static class ButtonHolder { } @Override public View getView(final int position, View convertView, ViewGroup parent) { View row = convertView; ViewHolder holder; if(row==null || row.getTag().equals("button")) { row = layoutInflater.inflate(R.layout.griditem, parent, false); holder = new ViewHolder(); holder.mainImage = (ImageView)row.findViewById(R.id.itemgrid); holder.checkBox = (CheckBox)row.findViewById(R.id.itemselected); holder.button = null; row.setTag(holder); } else { holder = (ViewHolder)row.getTag(); } if(position==thumbUrls.size()) { int width = row.getWidth(); int height = row.getHeight()-70; row = layoutInflater.inflate(R.layout.mybutton, parent, false); holder.button = (Button)row.findViewById(R.id.gridbutton); holder.button.setText("Load More"); LayoutParams params = holder.button.getLayoutParams(); params.height = height; params.width = width; holder.button.requestLayout(); holder.button.setOnClickListener(this); System.out.println("Called"); row.setTag("button"); return row; } else { setImageSize(holder.mainImage); System.out.println(position); holder.mainImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { intent.putExtra("position", position); intent.putStringArrayListExtra("MainUrls", mainUrls); intent.putStringArrayListExtra("Thumbnails", thumbUrls); context.startActivity(intent); } }); holder.checkBox.setOnCheckedChangeListener(null); holder.checkBox.setTag(position); holder.checkBox.setChecked(positions.contains(thumbUrls.get(position))); holder.checkBox.setOnCheckedChangeListener(this); UrlImageViewHelper.setUrlDrawable(holder.mainImage, thumbUrls.get(position), R.drawable.extras_load); return row; } } private void setImageSize(ImageView imageView) { LayoutParams params = imageView.getLayoutParams(); int leftWidth = width - 80; params.width = leftWidth/3; params.height = leftWidth/3; imageView.requestLayout(); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { positions.add(thumbUrls.get((Integer)buttonView.getTag())); urlsToUpload.add(mainUrls.get((Integer)buttonView.getTag())); } else { positions.remove(thumbUrls.get((Integer)buttonView.getTag())); urlsToUpload.remove(mainUrls.get((Integer)buttonView.getTag())); } } public static ArrayList<String> getUrlsToUpload() { return urlsToUpload; } @Override public void onClick(View v) { if(v.getId()==R.id.gridbutton) { InstagramImpl.getInstance().fetchMorePhotos(); } } }

Cualquier ayuda realmente sería realmente apreciada.

Gracias.


Tal vez puedas intentar delete row==null y holder = (ViewHolder)row.getTag(); es por problemas de reciclaje, puedes probar primero. Pero afectará la eficiencia. Otra cosa que quiero decir es cómo position==thumbUrls.size(); ? Tal vez sea la position==thumbUrls.size()-1; . Ok, esa es mi opinión, lo ayudo a funcionar.


getView método getView completo de mi otra respuesta. Simple, verifica la posición primero. Si es el último elemento (cargar más botón), devuelva el diseño de inmediato.

private final Media special = new Media("-1", "", "", "", ""); public MediaGridAdapter(Context context, int imageID, ArrayList<Media> array, int type, boolean isGetMore) { list = array; mediaType = type; this.context = context; if(list != null) { list.add(special); } } @Override public View getView(int position, View convertView, ViewGroup parent) { RelativeLayout item; ViewHolder holder; //this part check it''s the last item. -1 is my special item id in contructor. if(list.get(position).getId().equals("-1")) { item = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_special_more, null); item.setTag(MORE_BUTTON); return item; } // if(convertView == null || convertView.getTag().toString().equals(MORE_BUTTON)) { Context context = parent.getContext(); item = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_with_icon_vertical, null); holder = new ViewHolder(); holder.thumbnail = (ImageView) item.findViewById(R.id.iv_icon_media); item.setTag(holder); } else { item = (RelativeLayout) convertView; holder = (ViewHolder) item.getTag(); } } // set data. holder.thumbnail.setBitmap(...) return item;