0

私は3つのフィールドを持つ製品クラスを持っています:-

  1. id
  2. 名前
  3. 価格

私のコードでは、List<Product> productList = Collections.synchronizedList(new ArrayList<Product>());

この製品リストはを作成するために使用されますArrayAdapter<Product> adapter = ArrayAdapter<Product>()。productListを別のスレッドに入力すると、それに応じてアダプタに通知されます。それは絶対にうまく機能しています。

今、

  1. いくつかの特定の製品の色を変更したい(たとえば、価格が1000未満の場合)。
  2. ListViewの各行には、商品画像、名前、説明、価格の4つの要素が含まれている必要があります。
  3. ユーザーが製品をクリックすると、コンテキストメニューオプション、つまり製品の購入で、製品の表示が表示されます。

私はそれに関連するいくつかのブログとスレッドを読みました。それでもどこから始めればよいかわからないので、ArrayAdapterのカスタマイズ、getView()のオーバーライド、カスタムリストフィルターなどについて読みました。どちらの方法が私の要件に最適です...言い換えると、カスタムアダプターとリストフィルターはどのようにメリットがありますか自分 ?

4

2 に答える 2

3

BaseAdapterを拡張し、各アイテムに独自のレイアウトを提供する必要があります(getView())。ビューのリサイクルを管理することを忘れないでください。おそらくViewHolderパラダイムを使用してください。

編集

ListAdpaterはListViewにのみバインドされるため、あまり使用しませんでした。GridView用のアダプターが必要な場合がありますが、BaseAdapterを使用すると、すべてのユースケースに十分な自由度が得られます。

BaseAdapterの例:

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を持っている)で使用できます。

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

このようにして、ビューを拡張するListActivityはfindViewById()呼び出しを行うことができ、getListView()はこの内部listViewを返します。これは小さなハックです。別のIDを使用して独自のlistViewを配置し、findViewById()を自分で作成できます。ListActivityには、別のハックがあります。ListActivityが再び特別なIDを持つ空のビューを見つけた場合、リストが空のときに表示されます。

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

次に、ListViewで、ActivityまたはListActivityのどちらを使用した場合でも、ListViewでアダプターを設定できます。

getListView().setAdapter(new FanAdapter(this, myFanDataArray)));
于 2012-05-16T11:01:27.530 に答える
1

方法では、getView(...)価格を確認し、行の色を設定する必要があります...

このカスタマイズされたリストビューを参照してください。

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);
}
于 2012-05-16T11:03:00.357 に答える