更新适配器listView.setAdapter后,ListView失去位置(新的MyAdapter(...))

时间:2014-04-05 07:32:45

标签: java android listview android-listview android-arrayadapter

当ListView中的最终项目,我上传新的和更新后的适配器时:

ListView lvMain = (ListView) findViewById(R.id.list);
boxAdapter = null;
boxAdapter = new BoxAdapter(this, products);
lvMain.setAdapter(boxAdapter);

但在此之后,元素被加载但滚动位置在顶部。即ListView的位置丢失,再次查看所有

的开头

如何解决?

BoxAdapter代码:

public class BoxAdapter extends BaseAdapter {
      private final Context ctx;
      private final LayoutInflater lInflater;
      private final ArrayList<ItemInfo> objects;
      private final int loadCount = 10;
      private int count = 10;
      private String name, desc;

      BoxAdapter(Context context, ArrayList<ItemInfo> products) {

        this.ctx = context;
        this.objects = products;
        this.lInflater = (LayoutInflater) ctx
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      }



      // кол-во элементов
      @Override
      public int getCount() {
        //return objects.size();
          return this.count;
      }

      // элемент по позиции
      @Override
      public ItemInfo getItem(int position) {
          return objects.get(position);
      }

      // id по позиции
      @Override
      public long getItemId(int position) {
        return position;
      }

      public void loadAdditionalItems() {
            this.count += this.loadCount;
            if (this.count > this.objects.size()) {
                this.count = this.objects.size();
            }
            notifyDataSetChanged();
      }



      @Override
      public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;
        view = lInflater.inflate(R.layout.item, parent, false);

        ItemInfo p = getItem(position);
        TextView desc_id = (TextView) view.findViewById(R.id.desc);

        if (p.username.contains("null"))
        {
            name = "Автор: Неизвестен";
        }
        else
        {
           name = "Автор: " + p.username;
        }

        if(!p.description.contains("null"))
        {
            desc = p.description.replaceAll("<br />", "");
            desc = desc.replaceAll("&quot;", "");
        }
        else
        {
            desc = "";
            desc_id.setVisibility(View.GONE);
        }


        ((TextView) view.findViewById(R.id.name)).setText(name);
        ((TextView) view.findViewById(R.id.desc)).setText(desc);
        return view;
      }

}

P.S setOnScrollListener代码:

lvMain.setOnScrollListener(new OnScrollListener()
        {

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                    ListView lvMain = (ListView) findViewById(R.id.list);
                    if(firstVisibleItem + visibleItemCount >= totalItemCount) {
                        boxAdapter.loadAdditionalItems();
                        loading = false;
                    }
                    if (!loading && (lvMain.getLastVisiblePosition() + 10) >= (60))
                    {
                        new LoadLastestPost().execute();
                        loading = true;
                    }
            }

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub
            }

        });

1 个答案:

答案 0 :(得分:1)

最佳解决方案是在setProducts中创建boxAdapter方法,然后致电boxAdapter.notifyDataSetChanged()。例如:

boxAdapter.setProducts(products);
boxAdapter.notifyDataSetChanged();

如果您实施此方法,则无需多次调用lvMain.setAdapter(boxAdapter)

setProducts()方法添加到适配器:

public BoxAdapter extends BaseAdapter {

    Context mContext;
    ArrayList<ItemInfo> objects;

    public BoxAdapter(Context context, ArrayList<ItemInfo> products) {
        mContext = context;
        objects = products;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // inflate and adjust view
    }

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

    public Object getItem(int position) {
        return objects.get(position);
    }

    public void setProducts(ArrayList<ItemInfo> newData) {
        objects = newData;
    }
}

另外,我不会使用count变量。我只想在size中使用ArrayList方法。我会完全删除count