2011-11-24 25 views
17

ListView'de yinelenen öğeler alıyorum. Geri ve aşağı kaydırma bazen öğe sırasını değiştirir. Ben googled ve bu hata bildiren birçok iş parçacığı buldum, ancak bunların hiçbiri benim sorunumu gidermede bana yardımcı oldu.ListView'de yinelenen girişler

Aktivite:

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:

arada
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; 
    } 


} 

, çıkışı:

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 

Selamlar, ProgVal İşte

benim kodudur

cevap

32

bu deneyin:

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; 
    } 
} 

Açıklama: Eğer çiftleri var çünkü Android yeniden UI nesneler üzerinde listeleri. Boş değilse yeni bir tane oluşturmak yerine convertView'u yeniden kullanmanız bekleniyor. Elbette, yeniden kullanılmakta olan örneğe uygun bir değer belirlemekten siz sorumlusunuz. Aksi halde, değer son "kullanım" dan ayrılır.

+0

Tamam, buldum. Nesneyi sadece aynı madde için tekrar kullandığını düşündüm, başkalarını değil. Ancak, kaydırma çubuğu, görüntülenen öğenin yüksekliğine bağlı olarak, kaydırma yaptığımda artık daha büyük ve küçülüyor. –

+0

@Arhimed Lütfen "Açıklama" kısmını daha ayrıntılı olarak açıklayabilir misiniz? Uzun zamandır bu konuya takıldım. – AbhishekB

+1

@abhishekb: Ayrıntılar için lütfen burayı kontrol edin - http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ –

0

Bir öneri - title.setText'ten sonra bir günlük deyimi ekleyin ve getTitle() 'dan elde edilen değeri yazın. Yinelenen girişleri neden aldığınızı öğrenebilirsiniz.

2

ListView, eklediğiniz öğelerin benzersizliğini garanti etmez. Bu senin sorumluluğun. Öğeleri depolamak için ArrayList kullanıyorsunuz ve istediğiniz kadar çoğaltılmış öğe saklayabilirsiniz.

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

LinkedHashSet, ArrayList konuma göre erişim elemanlarını sağlayacak öğelerin başlangıç ​​sırasını koruyarak çiftleri kaldırır:

İsterseniz

çiftleri tekrar listeye ardından kümesi haline öğeleri koyup kaldırıldı etmek.

4
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; 
}