2011-11-24 26 views
17

ListViewに重複した項目があります。前後にスクロールすると、アイテムの順序が変更されることがあります。 私はグーグル・グーグルでこのバグを報告しているスレッドが多数見つかりましたが、いずれも問題の修正には役に立たなかった。ListViewの重複したエントリ

アクティビティー:

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


} 

、出力は次のとおりです。

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 

よろしく、 ProgValここ

は私のコードです

答えて

32

はこれを試してみてください。ヌルでない場合は、新しいものを作成するのではなく、convertViewを再利用する必要があります。もちろん、再利用されるインスタンスに適切な値を設定する責任があります。それ以外の場合は、最後の「使用量」から値が残ります。

+0

[OK]を、私はそれを得ました。私はそれが同じアイテムのものだけを再利用していると思っていました。 しかし、現在表示されている項目の高さに応じて、スクロールするとスクロールバーが大きくなり、小さくなります。 –

+0

@Arhimed「説明」の部分をより詳しく説明できますか?私は長い間この問題に悩まされています。 – AbhishekB

+1

@abhishekb:詳細はこちらをご確認ください - http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ –

0

提案 - title.setTextの後ろにlogステートメントを追加し、getTitle()から取得した値を書き込みます。なぜあなたは重複したエントリを取得しているのか分かるかもしれません。

2

ListViewは、そこに追加されたアイテムの一意性を保証しません。それはあなたの責任です。アイテムを格納するのにArrayListを使用していて、必要な数の重複アイテムを格納できます。

あなたが削除重複する場合は、もう一度リストにその後、セットにアイテムを入れて:

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

LinkedHashSetは、項目の最初の注文を保存重複を削除しますArrayListは位置によってアクセス要素を許可します。

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

説明:あなたはAndroidの再利用UIオブジェクト上で一覧表示するので、重複を得た

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; 
} 
関連する問題