studio item example ejemplo custom java android listview listactivity android-arrayadapter

java - item - listview android example



Entradas duplicadas en ListView (5)

Obtengo elementos duplicados en un ListView. El desplazamiento hacia atrás y hacia abajo a veces cambia el orden del artículo. Busqué en Google y encontré muchos subprocesos que informaban sobre este error, pero ninguno de ellos me ayudó a solucionar mi problema.

Aquí está mi código:

Actividad:

package com.github.progval.SeenDroid; import java.util.ArrayList; import java.util.List; import com.github.progval.SeenDroid.lib.Connection; import com.github.progval.SeenDroid.lib.Message; import com.github.progval.SeenDroid.lib.MessageFetcher; import com.github.progval.SeenDroid.lib.Query.ParserException; import android.app.Activity; import android.app.ListActivity; import android.content.SharedPreferences; import android.os.Bundle; public class ShowUserActivity extends ListActivity { private Connection connection; public ArrayList<Message> listMessages = new ArrayList<Message>(); public MessageAdapter adapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.profile); this.connection = new Connection(); this.setTitle(R.string.homefeed_title); this.listMessages = new MessageFetcher(this.connection).fetchUser(); this.bindUi(); } private void bindUi() { this.adapter = new MessageAdapter(this, this.listMessages); this.setListAdapter(adapter); // TODO Bind buttons } }

MessageAdapter:

package com.github.progval.SeenDroid; import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import com.github.progval.SeenDroid.lib.Message; import android.content.Context; import android.text.Layout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; public class MessageAdapter extends BaseAdapter { private Context context; private List<Message> items = new ArrayList<Message>(); private int lastPosition = 0; public MessageAdapter(Context context, List<Message> items) { super(); this.context = context; this.items = items; } public View getView(int position, View convertView, ViewGroup parent) { if (null == convertView) { LinearLayout view; view = (LinearLayout) LinearLayout.inflate(this.context, R.layout.message, null); Log.d("SeenDroid", String.format("Get view %d", position)); TextView title = new TextView(view.getContext()); title.setText(this.items.get(position).getTitle()); view.addView(title); return view; } else { return convertView; } } @Override public int getCount() { return this.items.size(); } @Override public Object getItem(int location) { return this.items.get(location); } @Override public long getItemId(int arg0) { return arg0; } }

Por cierto, la salida es:

D/SeenDroid(30939): Get view 0 D/SeenDroid(30939): Get view 1 D/SeenDroid(30939): Get view 2 D/SeenDroid(30939): Get view 3 D/SeenDroid(30939): Get view 4 D/SeenDroid(30939): Get view 5 D/SeenDroid(30939): Get view 6 D/SeenDroid(30939): Get view 7 D/SeenDroid(30939): Get view 8 D/SeenDroid(30939): Get view 0 D/SeenDroid(30939): Get view 16

Saludos, Progval



ListView no garantiza la singularidad de los elementos que se agregan allí. Es tu responsabilidad Está utilizando ArrayList para almacenar elementos y puede almacenar tantos elementos duplicados como desee.

Si desea eliminar los duplicados, coloque sus artículos en el conjunto y luego en la lista nuevamente:

listMessages = new ArrayList<Messages>(new LinkedHashSet<Message>(listMessages))

LinkedHashSet eliminará duplicados conservando el orden inicial de los elementos, ArrayList permitirá el acceso a los elementos por posición.


Prueba esto:

public View getView(int position, View convertView, ViewGroup parent) { if (null == convertView) { LinearLayout view = (LinearLayout) LinearLayout.inflate(this.context, R.layout.message, null); Log.d("SeenDroid", String.format("Get view %d", position)); TextView title = new TextView(view.getContext()); title.setText(this.items.get(position).getTitle()); view.addView(title); return view; } else { LinearLayout view = (LinearLayout) convertView; TextView title = (TextView) view.getChildAt(0); title.setText(this.items.get(position).getTitle()); return convertView; } }

Explicación : recibió los duplicados porque las listas en Android reutilizan los objetos de la IU. Se espera que reutilice convertView lugar de crear uno nuevo si no es nulo. Por supuesto, usted es responsable de establecer un valor apropiado para la instancia que se reutiliza. De lo contrario, el valor se deja desde el último "uso".


Una sugerencia: agregue una declaración de registro después de title.setText y escriba el valor obtenido de getTitle (). Podría llegar a saber por qué está recibiendo entradas duplicadas.


public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridView; if (convertView == null) { gridView = new View(context); } else { gridView = (View) convertView; } gridView = inflater.inflate(R.layout.worker_listmain, null); // your source code here!!! Run 100% // I got this problem also, I found out the way to solve it! // Please use my source code :D SIMPLE is PERFECT :D return gridView; }