我有一个ListView和一个BaseAdapter.我正在从webservice下载产品并在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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是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>
Run Code Online (Sandbox Code Playgroud)
此外,当我getView()像这样更改BaseAdapter的方法时,它工作正常
@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;
}
Run Code Online (Sandbox Code Playgroud)
但是这种类型的问题是我在listview行上显示产品的图像,这里我没有考虑过.使用这种类型的代码getView()方法总是在滚动listView时创建新的View,这样我就不得不一次又一次地下载图像.I使用的ImageLoader类cash memory用于下载图像,但问题是,当我将图像设置为ImageView很多次它给我out of memory error.
请帮我解决这个问题.
谢谢
Kni*_*edi 10
由于链接到正确的解决方案,我来到这里.
这里的问题是您在创建新视图时将产品绑定到视图一次.您应该在每次通话时拨打以下电话getView:
product = (Product) getItem(position);
v.setTag(product);
Run Code Online (Sandbox Code Playgroud)
但是你可以v.setOnClickListener(this)在创建视图后调用它(无论如何它都不会改变).
这应该可以解决问题.这里只是滥用了视图类型实现.我建议在这里阅读我的答案 ......
因此,根据Knickedi提出的建议,该方法应如下所示:getView()
public View getView(int position, View v, ViewGroup parent) {
TextView tvProductname;
TextView tvReviewsCounts;
Button btnPrice;
// Phase 1...
if (v == null) {
v = inflater.inflate(R.layout.product_listview_row, null);
v.setOnClickListener(this);
tvProductname = (TextView)v.findViewById(R.id.tvProductname);
tvReviewsCounts = (TextView)v.findViewById(R.id.tvReviews);
btnPrice = (Button)v.findViewById(R.id.btnPrice);
v.setTag(R.id.tvProductname, tvProductname);
v.setTag(R.id.tvReviews, tvReviewsCounts);
v.setTag(R.id.btnPrice, btnPrice);
}
else {
tvProductname = (TextView) v.getTag(R.id.tvProductname);
tvReviewsCounts = (TextView) v.getTag(R.id.tvReviews);
btnPrice = (Button) v.getTag(R.id.btnPrice);
}
// Phase 2...
Product product = (Product) getItem(position);
tvProductname.setText(product.getTitle());
btnPrice.setText(product.getSellingPrice());
String strReviewCount = product.getReviews();
if(strReviewCount != null)
tvReviewsCounts.setText(strReviewCount +" Reviews");
return v;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13979 次 |
| 最近记录: |