Android 如何在适配器更新时保持listview的滚动位置

Android 如何在适配器更新时保持listview的滚动位置,android,listview,android-adapter,android-scrollview,android-scroll,Android,Listview,Android Adapter,Android Scrollview,Android Scroll,我将适配器与listview绑定,首先我获取了10条记录,然后当我滚动结束时,再次在listview中添加项目,它工作得非常完美 但当我在滚动结束后添加项目时,此时项目被成功添加,然后listview位置设置为顶部。我想将该位置设置为新添加的项目 这是我的密码: onscroll函数: public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int

我将适配器与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);

}
异步函数:

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

}
类项扩展异步任务{
@凌驾
受保护的void onPreExecute(){
...
}
受保护的字符串doInBackground(字符串…args){
List params=new ArrayList();
添加(新的BasicNameValuePair(“id”,String.valueOf(id));
JSONObject json=jParser.makeHttpRequest(url,“GET”,
参数);
试一试{
对于(int i=0;i
基本适配器:

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;
    }
}
公共类CategoryAdapter扩展了BaseAdapter{
语境;
//受保护名单;
受保护的列表项目;
公共类别适配器(上下文、列表项){
this.context=上下文;
this.rowItems=项目;
}
公共void addItemAll(列表项){
//
rowItems.addAll(项目);
notifyDataSetChanged();
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回rowItems.size();
}
@凌驾
公共对象getItem(int位置){
返回行项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(最终整型位置,视图转换视图,
视图组(父级){
//TODO自动生成的方法存根
if(convertView==null){
convertView=LayoutFlater.from(getActivity())。充气(
R.layout.row,空);
}
产品行项目=(产品)获取项目(位置);
TextView text=ViewHolderPattern.get(convertView,R.id.item_name);
text.setText(rowItem.getTitle());
返回视图;
}
}
现在如何设置添加新项目时滚动的位置

当前,当添加新项目时,它将转到listview的顶部

但我想设置新项目的起始位置


如何执行此操作?

每次在AsyncTask中执行代码时,您都在创建适配器的新实例。i、 在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);
adapter=newcategoryadapter(上下文,newlist());
线性类。设置适配器(适配器);
在实例化ListView以使其正常工作之后

数据将在您的列表中更新,您的职位将保持不变


干杯

每次在AsyncTask中执行代码时,您都在创建适配器的新实例。i、 在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);
adapter=newcategoryadapter(上下文,newlist());
线性类。设置适配器(适配器);
在实例化ListView以使其正常工作之后

数据将在您的列表中更新,您的职位将保持不变


干杯

在onScroll回调中使用getFirstVisiblePosition()获取列表顶部可见项的位置。并使用setSelection()方法在onPostExecute()回调中再次设置它。在onScroll回调中使用getFirstVisiblePosition()获取列表顶部可见的项的位置。并使用setSelection()方法在onPostExecute()回调中再次设置它。logcat中的错误是什么?您还可以在从adapter.logcat:
fragment.CategoryFragment$items.onPostExecute(CategoryFragment.java:248)fragment.CategoryFragment$items.onPostExecute(CategoryFragment.java:1)的addItem函数中删除notifyDataSetChanged()后,在android.os.AsyncTask.finish中完成(AsyncTask.java:632)在android.os.AsyncTask.access$600中尝试(AsyncTask.java:177)在android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)在android.os.Handler.dispatchMessage(Handler.java:110)在android.os.Looper.loop(Looper.java:193)上
更新了答案,请看看它是否解决了问题。这也是logcat的全部错误吗?还是您遗漏了顶部的某些内容?应该列出了一些异常,如NullPointerException或其他什么?这意味着您的适配器将为null。如果您在此fr中实例化适配器,则应该解决此问题在OnView中创建agment并将该适配器分配给listview。logcat中的错误是什么?您还可以在从adapter.logcat:
fragment.CategoryFragment$items.onPostExecute(CategoryFragment.java:248)的addItemAll函数中删除notifyDataSetChanged()后尝试一下(CategoryFragment.java:1)android.os.AsyncTask.finish(AsyncTask.java:632)android.os.AsyncTask.access$600(AsyncTask.java:177)android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)android.os.Handler.dispatchMessage(Handler.java:110)android.os.Looper.loop(Looper.java:193)