2012-05-16 67 views
0

我有一個產品類別,其中有三個領域: -ListView和ArrayAdapter問題,我如何繼續?

  1. ID
  2. 價格

在我的代碼創建一個List<Product> productList = Collections.synchronizedList(new ArrayList<Product>());

本產品列表用於創建ArrayAdapter<Product> adapter = ArrayAdapter<Product>(),我將productList填充到單獨的線程中,並且相應地通知適配器。它工作得很好。

現在,

  1. 我想改變某些特定產品的顏色(比如價格< 1000)。
  2. ListView中的每一行應該包含4種元素的產品的照片,姓名,內容描述和價格。
  3. 當用戶點擊該產品,在上下文菜單選項,即買產品,查看產品應顯示。

我已閱讀相關的是一些博客和線程。不過我不能決定從哪裏開始,我讀到一個ArrayAdapter的定製,覆蓋getView(),自定義列表過濾器等哪種方式將是最適合我的需求......換句話說,如何能自定義適配器和列表過濾器的好處我 ?

+1

在我看來,自定義'ArrayAdapter'並覆蓋'getView() '將是您的案例中選擇的最佳選擇。 – Nishant

+0

@Thanks Nishant ...我也做了完全一樣的... – aProgrammer

回答

3

您應該延伸BaseAdapter,併爲每個項目提供自己的佈局(getView())。不要忘記管理視圖回收,也許使用ViewHolder範例。

編輯

我沒有使用很多ListAdpater,因爲它綁定到只有一個ListView。有時我需要一個GridView適配器,並且BaseAdapter爲我提供了足夠的自由度來適用於所有用例。 BaseAdapter的

實施例:

<ListView 
     android:id="@id/android:list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:cacheColorHint="@android:color/transparent" /> 

這樣:

public class FanAdapter extends BaseAdapter { 

    private List<Fan> mFans; 
    private Activity mContext; 

    public FanAdapter(Activity context, List<Fan> fans) { 
     mContext = context; 
     mFans = fans; 
    } 

    private class ViewHolder { 

     public ImageView image; 
     public TextView firstName; 
     public TextView lastName; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup container) { 
     if (view == null) { 
      view = LayoutInflater.from(mContext).inflate(R.layout.fan_item, container, false); 
     } 

     ViewHolder viewHolder = (ViewHolder) view.getTag(); 
     if(viewHolder == null){ 
      viewHolder = new ViewHolder(); 
      viewHolder.image = (ImageView) view.findViewById(R.id.image); 
      viewHolder.firstName = (TextView) view.findViewById(R.id.firstname); 
      viewHolder.lastName = (TextView) view.findViewById(R.id.lastname); 
      view.setTag(viewHolder); 
     } 

     // setting here values to the fields of my items from my fan object 
     viewHolder.firstName.setText(fan.getFirstName()); 
     (...) 


     return view; 
    } 

    @Override 
    public int getCount() { 
     if (mFans != null) { 
      return mFans.size(); 
     } else { 
      return 0; 
     } 
    } 

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

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

可以用含有一個ListView或ListActivity(具有在其佈局具有特殊的id一個ListView)一個活動使用它,你ListActivity將膨脹的觀點就能做出findViewById()調用和getListView()將返回這個內部的ListView。這是一個小小的破解,你可以把你自己的listView與另一個id並自己做findViewById()。對於ListActivity,還有另一種破解:如果ListActivity發現再次與一個特殊的ID空視圖,它會顯示在列表爲空:

<include 
    android:id="@+id/empty" 
    layout="@layout/empty" 
    android:visibility="gone" 
    android:layout_gravity="center" /> 

然後在你的ListView,無論你使用的活動或ListActivity ,你可以在設置的ListView適配器:

getView(...)方法
getListView().setAdapter(new FanAdapter(this, myFanDataArray))); 
+0

+1,謝謝..... – aProgrammer

+0

可以請舉一些例子,我對** BaseAdapter,ListAdapter,ArrayAdapter **和'ListActivity' ,我應該選擇哪一個擴展/定製... – aProgrammer

+0

完成,在我的回覆中添加它 – galex

1

你必須檢查的價格和集行的顏色...

看到這個列表視圖定製..

http://samir-mangroliya.blogspot.in/p/android-customized-listview.html

我設置行的顏色按照奇數和偶數行

you can set checking price... 

if(price < 1000){ 
     row.setBackgroundColor(Color.RED); 
}else{ 
     row.setBackgroundColor(Color.Yellow); 
} 
+0

我應該需要擴展ListActivity?如果是的話如何?請舉一些相關的例子......謝謝! – aProgrammer

+0

你可以擴展ListActivity但它不是強制性的。請參閱我上面的鏈接示例並仔細閱讀。 –