0

我有一个产品类,它包含三个字段:-

  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 的 Activity 一起使用(在其布局中有一个具有特殊 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。这是一个小技巧,您可以将自己的 listView 与另一个 id 放在一起,然后自己制作 findViewById()。对于 ListActivity,还有另一个 hack:如果 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 回答