Java 更新适配器ListView.setAdapter(新的MyAdapter(…)后,ListView失去位置
在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 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(""", "");
}
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;
}
}