ListView和ArrayAdapter问题,如何继续?

时间:2012-05-16 10:56:53

标签: android listview android-arrayadapter

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

  1. ID
  2. 名称
  3. 在我的代码中,我创建了一个List<Product> productList = Collections.synchronizedList(new ArrayList<Product>());

    此产品列表用于创建ArrayAdapter<Product> adapter = ArrayAdapter<Product>(),我在单独的线程中填充productList,并相应地通知适配器。它工作得非常好。

    现在,

    1. 我想更改某些特定产品的颜色(比如价格&lt; 1000)。
    2. ListView的每一行应包含4个元素product image,name,desc and price。
    3. 当用户点击产品时,在上下文菜单选项中,即购买产品,应显示查看产品。
    4. 我已经阅读了几篇与之相关的博客和主题。我仍然无法决定从哪里开始,我读到了关于ArrayAdapter的自定义,重写getView(),自定义列表过滤器等。哪种方式对我的要求最好...换句话说,自定义适配器和列表过滤器如何受益我 ?

2 个答案:

答案 0 :(得分: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)));

答案 1 :(得分: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);
}