studio recyclerview recycler example ejemplo cardview android android-layout gridview drawable

example - recyclerview android studio ejemplo



Los elementos dentro de GridView se repiten cuando la pantalla se desplaza (5)

Estoy usando un GridView para mostrar un conjunto de categorías que el usuario puede elegir. Cada elemento de la cuadrícula está compuesto por un ImageView y un TextView, ambos recuperados del servidor. Cuando se toca un elemento, se inicia otra actividad.

Pensé que todo iba bien, hasta que me di cuenta de que algunas veces se repetían cuando desplazo la pantalla. Siempre que me desplazo hacia abajo a través de la cuadrícula y luego retrocedo, cambia su posición y se duplica. Pero incluso cuando toco los temas desordenados, los valores correctos se envían a la siguiente actividad.

Mirando en LogCat, ocurre cualquier solicitud repetida al servidor. De hecho, tengo esto mientras me desplazo:

06-28 12:36:38.554: D/dalvikvm(358): GC_EXTERNAL_ALLOC freed 2061 objects / 156024 bytes in 51ms 06-28 12:36:42.915: D/dalvikvm(358): GC_FOR_MALLOC freed 6590 objects / 737528 bytes in 57ms 06-28 12:38:26.725: D/dalvikvm(358): GC_EXTERNAL_ALLOC freed 5426 objects / 468176 bytes in 71ms 06-28 12:38:26.875: D/dalvikvm(358): GC_EXTERNAL_ALLOC freed 409 objects / 17480 bytes in 68ms

Parece que cada vez que me desplazo, se redibujan ...

ACTUALIZACIÓN: solo se vuelve a dibujar la primera vez que me desplazo hacia abajo en GridView. Después de esto, todos los itens, incluyendo los repetidos, se mantienen en sus lugares.

Mi clase de java:

public void proccess(){ int qtdCategorias = json.length(); imagens = new Drawable[qtdCategorias]; categorias = new String[qtdCategorias]; for (int i=0; i<qtdCategorias; i++){ JSONArray c = json.optJSONArray(i); String urlAmigavel = null; String imagemSite = null; String nomeCategoria = null; try { urlAmigavel = c.getString(6); imagemSite = c.getString(3); nomeCategoria = c.getString(2); } catch (JSONException e) { Log.e("CategoriasJogarActivity", e.toString()); e.printStackTrace(); } categorias[i] = nomeCategoria; imagens[i] = getImagem(urlAmigavel, imagemSite); } gridview = (GridView) findViewById(R.id.include3); ImageAdapter imageAdapter = new ImageAdapter(ctx, imagens, categorias); gridview.setAdapter(imageAdapter); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { String name = null; String idt = null; try { JSONArray c = json.optJSONArray(position); name = c.getString(2); idt = c.getString(0); } catch (JSONException e) { Log.e("CategoriasJogarActivity", "JSONException" + e.toString()); } Intent in = new Intent(getApplicationContext(), JogarActivity.class); in.putExtra(TAG_NAME, name); in.putExtra(TAG_ID, idt); in.putExtra(TAG_PRIMEIRAPERGUNTA, true); startActivity(in); } }); } public Drawable getImagem(String urlAmigavel, String img) { String url = "http://www.qranio.com/pergunta/" + urlAmigavel + "/"+ img; InputStream is = null; try { URL urlImagem = new URL(url); is = (InputStream) getObjeto(urlImagem); } catch (MalformedURLException e1) { Log.e("CategoriasJogarActivity", e1.toString()); e1.printStackTrace(); } Drawable d = Drawable.createFromStream(is, "src"); return d; } private Object getObjeto(URL url) { Object content = null; try { content = url.getContent(); } catch (IOException e) { Log.e("CategoriasJogarActivity", e.toString()); e.printStackTrace(); } return content; }

clase imageAdapter

public class ImageAdapter extends BaseAdapter{ private Context mContext; private final Drawable[] mThumbIds; private final String[] mTextIds; public ImageAdapter(Context c, Drawable[] d, String[] s) { mContext = c; mThumbIds = d; mTextIds = s; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } //create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { //ImageView imageView; View v; if (convertView == null) { // if it''s not recycled, initialize some attributes LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); v = inflater.inflate(R.layout.gridview_item_layout, null); TextView text = (TextView)v.findViewById(R.id.grid_item_text); text.setText(mTextIds[position]); ImageView image = (ImageView)v.findViewById(R.id.grid_item_image); image.setImageDrawable(mThumbIds[position]); } else { v = (View) convertView; } return v; } }

xml gridview_item_layout

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview_item_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center_horizontal" > <ImageView android:id="@+id/grid_item_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitCenter" android:minHeight="100dip" android:minWidth="100dip" > </ImageView> <TextView android:id="@+id/grid_item_text" android:layout_width="match_parent" android:layout_height="match_parent" android:text="TextView" android:gravity="center" android:textColor="#F9A512" android:textStyle="bold" android:textSize="18dp" > </TextView> </LinearLayout>

xml gridview

<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:verticalSpacing="10dip" android:horizontalSpacing="10dip" android:stretchMode="columnWidth" android:gravity="center" android:background="#FFFFFF" android:padding="5dip" />

Vi otras preguntas sobre este mismo problema, pero ninguna de ellas respondió. ¿Alguna idea de lo que está pasando?


Cambia aquí y vuelve a intentarlo,

View v; if (convertView == null) { // if it''s not recycled, initialize some attributes LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); v = inflater.inflate(R.layout.gridview_item_layout, null); TextView text = (TextView)v.findViewById(R.id.grid_item_text); text.setText(mTextIds[position]); } else { v = (View) convertView; } if(view!=null) { ImageView image = (ImageView)v.findViewById(R.id.grid_item_image); image.setImageDrawable(mThumbIds[position]); notifyDataSetChanged(); //Calling this helped to solve the problem. } return v; }



Es normal que vea los mismos elementos a medida que se desplaza hacia abajo en GridView porque en el método getView establece los elementos dibujables para ImageView solo cuando el convertView es null (por ejemplo, para los primeros elementos que se ven cuando aparece GridView en la pantalla) . Si el convertView no es null , lo que significa que tiene una vista de fila reciclada, no configura la imagen correcta y permanece con la imagen que se configuró previamente en esta vista reciclada. Intenta modificar el método getView esta manera:

public View getView(int position, View convertView, ViewGroup parent) { View v; if (convertView == null) { // if it''s not recycled, initialize some attributes LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); v = inflater.inflate(R.layout.gridview_item_layout, parent, false); } else { v = (View) convertView; } TextView text = (TextView)v.findViewById(R.id.grid_item_text); text.setText(mTextIds[position]); ImageView image = (ImageView)v.findViewById(R.id.grid_item_image); image.setImageDrawable(mThumbIds[position]); return v; }

Al hacer clic en un elemento, se muestran los elementos correctos porque utiliza el parámetro de position para recuperar los datos.


Este es mi código para GirdView con Button + Textview

public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) { convertView = mInflater.inflate(R.layout.grid_item, null); } else { holder = (ViewHolder) convertView.getTag(); } TextView text = (TextView)convertView.findViewById(R.id.texto_grid); text.setText(app_listaActiva_NOMBRES[position]); Button image = (Button)convertView.findViewById(R.id.miniatura_grid); image.setBackgroundResource(R.drawable.custom_button); image.setOnClickListener(new MyOnClickListener2(position,app_listaActiva_SONIDOS)); return convertView; }


Send y gridview o listview y en constructor implementan este método implementan onscroll listener

this.mGridView = mGridView; this.mGridView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Log.v("onScrollStateChanged", "onScrollStateChanged"); if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { isScrollStop = true; notifyDataSetChanged(); } else { isScrollStop = false; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.v("onScroll", "onScroll"); } });