当适配器更新时,如何维护listview的滚动位置



我将适配器与listview绑定,首先我获取10条记录,然后当我滚动结束时,然后再次在listview中添加项目,它工作完美。

但是当我在滚动结束后添加项目时,那时项目被成功添加,然后listview位置设置为顶部。我想把这个位置设置为新添加的项目。

下面是我的代码:

onscroll功能:

public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {               
    new items().execute();
}

异步功能:

class items extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        ...
    }
    protected String doInBackground(String... args) {

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("id", String.valueOf(id)));
        JSONObject json = jParser.makeHttpRequest(url, "GET",
                params);

        try {

            for (int i = 0; i < products.length(); i++) {
                JSONObject c = products.getJSONObject(i);
                // Storing each json item in variable
                String id = c.getString(TAG_PID);
                String name = c.getString(TAG_NAME);
                Product item = new Product(name, imageurl);
                product_name.add(item);
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}
protected void onPostExecute(String file_url) {
    // dismiss the dialog after getting all products
    pDialog.dismiss();

    adapter = new CategoryAdapter(context, product_name);
    category_linear.setAdapter(adapter);
}

Baseadapter:

public class CategoryAdapter extends BaseAdapter {
    Context context;
    // protected List<String> m_List;
    protected List<Product> rowItems;
    public CategoryAdapter(Context context, List<Product> items) {
        this.context = context;
        this.rowItems = items;
    }
    public void addItemAll(List<Product> item) {
        //
        rowItems.addAll(item);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return rowItems.size();
    }
    @Override
    public Object getItem(int position) {
        return rowItems.get(position);
    }
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public View getView(final int position, View convertView,
                        ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {
            convertView = LayoutInflater.from(getActivity()).inflate(
                    R.layout.row, null);
        }
        Product rowItem = (Product) getItem(position);
        TextView text = ViewHolderPattern.get(convertView, R.id.item_name);
        text.setText(rowItem.getTitle());
        return convertView;
    }
}

现在我如何设置滚动的位置,而新的项目添加。

当前,当新的项目被添加,那么它将去顶部的列表视图。

但是我想将位置设置为新项目开始。

我该怎么做?

每次执行AsyncTask中的代码时,都在创建一个适配器的新实例。即在你的onPostExecute函数中。而不是做

adapter = new CategoryAdapter(context, product_name);
category_linear.setAdapter(adapter);

你应该做

adapter.addItemAll(product_name);
adapter.notifyDataSetChanged();

还要写下面的

adapter = new CategoryAdapter(context, new List<Product>());
category_linear.setAdapter(adapter);

就在你实例化你的ListView使它工作之后。

数据将在你的列表中更新,你的位置将保持不变。

干杯!

相关内容

  • 没有找到相关文章

最新更新