我有一个产品类,它有三个字段: -
在我的代码中,我创建了一个List<Product> productList = Collections.synchronizedList(new ArrayList<Product>());
此产品列表用于创建ArrayAdapter<Product> adapter = ArrayAdapter<Product>()
,我在单独的线程中填充productList,并相应地通知适配器。它工作得非常好。
现在,
我已经阅读了几篇与之相关的博客和主题。我仍然无法决定从哪里开始,我读到了关于ArrayAdapter的自定义,重写getView(),自定义列表过滤器等。哪种方式对我的要求最好...换句话说,自定义适配器和列表过滤器如何受益我 ?
答案 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);
}