Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新适配器ListView.setAdapter(新的MyAdapter(…)后,ListView失去位置_Java_Android_Listview_Android Listview_Android Arrayadapter - Fatal编程技术网

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

Java 更新适配器ListView.setAdapter(新的MyAdapter(…)后,ListView失去位置,java,android,listview,android-listview,android-arrayadapter,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代码:

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

}

最好的解决方案是在
boxAdapter
中创建一个
setProducts
方法,然后调用
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;
    }
}
public-BoxAdapter扩展了BaseAdapter{
语境;
阵列列表对象;
public BoxAdapter(上下文、ArrayList产品){
mContext=上下文;
对象=产品;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
//充气并调整视野
}
public int getCount(){
返回objects.size();
}
公共对象getItem(int位置){
返回对象。获取(位置);
}
public void setProducts(ArrayList newData){
对象=新数据;
}
}

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

在适配器中调用此函数时我该怎么办?如果适配器的其余部分设置正确,这两种方法应足以刷新列表并使您保持在列表中的相同位置。你不必做更多的事情。这我明白,但我不明白如何在类适配器中添加product in adapter。我会尽最大努力更新我的答案,但如果你发布你的
BoxAdapter
代码,这会很有帮助。使用
ViewHolder
模式可以获得更好的性能。谢谢你的建议
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;
    }
}