我正在尝试实现无尽的滚动列表 View ,但是当我调用notifyDataSetChanged()时,整个列表都会刷新,然后滚动位置会回到顶部。

这是正常现象吗?如何使它简单地添加添加的项目而不刷新并保持滚动位置?

最佳答案

这种行为是不正常的。我看不到您的代码,我建议您执行以下操作:

1)您不是从UI线程调用notifyDataSetChanged()。正确的方法:

runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

2)您是否偶然拨打了adapter.notifyDataSetInvalidated();
3)在您的适配器中,您重写adapter.notifyDataSetChanged();方法并添加了说明,以转到顶部

4)如果使用列表填充适配器-每次都提供新列表,则刷新适配器设置。您应该始终提供相同的列表。但是,您可以根据需要进行任意更改。如果要重置列表,请使用list.clear而不是list = new ArrayList();
这是我的适配器的示例:
public class Adapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater = null;
    public ImageLoader imageLoader;

    public MediaItemAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data = d;
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null) {
            vi = inflater.inflate(R.layout.item_composer, null);
        }
        TextView title = (TextView) vi.findViewById(R.id.item_title); // title
        TextView price = (TextView) vi.findViewById(R.id.price);


        return vi;
    }


}

要求适配器:
List myList = new ArrayList<HashMap<String, String>>();
Adapter ma = new Adapter(this, myList);

适配器初始化之前,myList可以为空。

然后对我的列表进行一些操作:
myList.add(someElement);
ma.notifyDataSetChanged();

如果需要删除所有项目:
myList.clear();
ma.notifyDataSetChanged();

这样的实现是无止境的,我看到了超过一万五千个元素,没有任何问题。

07-24 09:49
查看更多