【问题标题】:Duplicated entries in ListViewListView 中的重复条目
【发布时间】:2012-01-05 21:03:45
【问题描述】:

我在 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
    }
}

消息适配器:

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

问候, 程序验证

【问题讨论】:

    标签: java android listview listactivity android-arrayadapter


    【解决方案1】:

    试试这个:

    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 对象。如果convertView 不为空,您应该重用它而不是创建一个新的。当然,您有责任为正在重用的实例设置适当的值。否则,该值是从最后一个“使用”中留下的。

    【讨论】:

    • 好的,我知道了。我认为这只是将对象重用于同一个项目,而不是其他项目。但是,当我滚动时,滚动条现在会变得越来越小,具体取决于当前显示项目的高度。
    • @Arhimed 您能否更详细地解释“解释”部分。我被这个问题困扰了很长时间。
    • 感谢@Arhimed,你拯救了我的一天。
    【解决方案2】:
    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;
    }
    

    【讨论】:

      【解决方案3】:

      ListView 不保证您添加的项目的唯一性。这是你的责任。您正在使用ArrayList 存储项目,它可以存储任意数量的重复项目。

      如果您想删除重复项,请将您的项目放入集合中,然后再次放入列表中:

      listMessages = new ArrayList&lt;Messages&gt;(new LinkedHashSet&lt;Message&gt;(listMessages))

      LinkedHashSet 将删除重复项,保留项目的初始顺序,ArrayList 将允许按位置访问元素。

      【讨论】:

        【解决方案4】:

        一个建议——在title.setText之后添加一条日志语句,并写入从getTitle()中得到的值。您可能会知道为什么会收到重复条目。

        【讨论】:

          【解决方案5】:

          您应该在 ListAdapter 中使用 ViewHolder 范例

          可以在这里找到一个很好的例子: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

          【讨论】:

          • 如何处理绑定视图新视图,我尝试了标签持有者模式,但它仍然重复。
          猜你喜欢
          • 2013-12-01
          • 1970-01-01
          • 2011-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          相关资源
          最近更新 更多