gpt4 book ai didi

android - Listview 行顺序在 android 中的 listview 滚动时随机变化

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:21 25 4
gpt4 key购买 nike

我有一个 ListView 和一个 BaseAdapter。我正在从 Web 服务下载产品并显示在 ListView 上。它在 ListView 上正确显示。

但是当我滚动时,ListView 在随机位置显示行意味着有时第三行显示在第一个位置,中间位置行显示在最后一个位置等等。

这是我的适配器类

public class ProductListAdapter extends BaseAdapter implements OnClickListener{

LayoutInflater inflater;
ArrayList<Product> arrProducts;
Context c;

public ProductListAdapter(Context c, ArrayList<Product> arrProducts) {
super();
inflater = LayoutInflater.from(c);
this.arrProducts = arrProducts;
this.c = c;
}

@Override
public int getCount() {
return arrProducts.size();
}

@Override
public Object getItem(int position) {
return arrProducts.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View v, ViewGroup parent) {
Product product = null;
if(v == null) {
v = inflater.inflate(R.layout.product_listview_row, null);
product = (Product) getItem(position);
v.setTag(product);
}else {
product = (Product)v.getTag();
}

v.setOnClickListener(this);

TextView tvProductname = (TextView)v.findViewById(R.id.tvProductname);
tvProductname.setText(product.getTitle());

String strReviewCount = product.getReviews();
TextView tvReviewsCounts = (TextView)v.findViewById(R.id.tvReviews);
if(strReviewCount != null) tvReviewsCounts.setText(strReviewCount +" Reviews");

Button btnPrice = (Button)v.findViewById(R.id.btnPrice);
btnPrice.setText(product.getSellingPrice());

return v;
}

@Override
public void onClick(View v) {
Product product = (Product) v.getTag();
Intent i = new Intent(c, ProductDetails.class);
i.putExtra(Product.PROD_ID, product.getId());
startActivity(i);
}

@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}

@Override
public int getViewTypeCount() {
return super.getViewTypeCount();
}
}

这是 XML 布局的 ListView

<ListView android:id="@+id/lstProducts" style="@style/fill_parent"
android:dividerHeight="1dp" android:divider="#dbd3c5"
android:scrollbars="vertical" android:layout_below="@id/layLine"></ListView>

另外,当我像这样更改 BaseAdapter 的 getView() 方法时,它工作正常

@Override
public View getView(int position, View v, ViewGroup parent) {
Product product = null;
v = inflater.inflate(R.layout.product_listview_row, null);
product = (Product) getItem(position);
v.setTag(product);
v.setOnClickListener(this);

TextView tvProductname = (TextView)v.findViewById(R.id.tvProductname);
tvProductname.setText(product.getTitle());

String strReviewCount = product.getReviews();
TextView tvReviewsCounts = (TextView)v.findViewById(R.id.tvReviews);
if(strReviewCount != null) tvReviewsCounts.setText(strReviewCount +" Reviews");

Button btnPrice = (Button)v.findViewById(R.id.btnPrice);
btnPrice.setText(product.getSellingPrice());

return v;
}

但是这种类型的问题是我在 ListView 行上显示产品图像,我在这里没有考虑过。通过使用这种类型的代码 getView() 方法总是在以下情况下创建新 View 曾经滚动 listView,所以我不得不一次又一次地下载图像。我使用了 ImageLoader 类,它使用 cash memory 下载图像,但问题是当我多次将图像设置为 ImageView,它给我内存不足错误

请帮我解决这个问题。

谢谢

最佳答案

我来到这里是因为有指向正确解决方案的链接。

这里的问题是您在创建新 View 时将产品绑定(bind)到 View 一次。您应该在每次调用 getView 时调用它:

product = (Product) getItem(position);
v.setTag(product);

但是您可以在创建 View 后调用 v.setOnClickListener(this)(它无论如何都不会改变)。

这应该可以解决问题。 View 类型实现在这里被滥用了。我建议阅读 my answer here ...

关于android - Listview 行顺序在 android 中的 listview 滚动时随机变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com