2011-09-26 112 views
12

列表視圖的滾動隨機排序的變化我有一個ListView和一個BaseAdapter.I我下載的listview.It從互聯網服務和產品陳列上的列表視圖可以正確地顯示。列表視圖排在安卓

但是,當我的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 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()方法這樣它工作正常

的ListView
@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; 
    } 

但在這種類型的問題是我展示產品列表視圖上排,我使用here.By這種類型的代碼getView()方法總是創造新的視圖時的ListView所以不斷滾動,我有沒有考慮像重新下載圖像和again.I使用哪種使用cash memory圖片供下載,但問題是,當我設置圖像的ImageView很多時候它給我out of memory errorImageLoader類。

請幫我從這個問題。

感謝

回答

10

我降落,因爲鏈接到解決方案在這裏。

的這裏的問題是,一旦你綁定你的產品的看法,當你創建一個新的視圖。你應該把這種對getView每個電話:

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

但是,一旦你創建的視圖中,您可以調用v.setOnClickListener(this)(它不會改變反正)。

這應該做的伎倆。視圖類型的實現只是在這裏被濫用。我建議閱讀my answer here ...

+0

我知道我的回答是不被使用的確切方式,但暫時目的我使用視圖類型來管理它。希望你的解決方案能夠正常工作並被檢查 –

+0

謝謝。我希望你不要生氣,這不是我的意圖。這裏的問題是,人們接受普通和工作的*技巧,然後在事情出錯或者他們想要使用真正的視圖類型實現時變得非常困惑......我只是想讓它清楚,而不是開始傳言; - ) – Knickedi

+0

不,不,它對我來說也是很好的解決方案。我個人認爲你的答案肯定會奏效,我也會嘗試一下。而感覺不好從來就不是情況,我也在這裏學習。這是從你那裏得到的新東西。謝謝。 –

5

因此,根據Knickedi作出recommendations,該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; 
} 
+0

在API級別4中添加了public void setTag(int key,Object tag)'... – eightyfive