android如何在listview的自定义ArrayAdapter之后管理项目

时间:2012-11-13 20:06:54

标签: android android-listview android-arrayadapter

我希望我的ListView保留View作为每个项目,因此我编写了自己的ArrayAdapter。也就是说,我的ListView现在是View的列表,而不是TextView

但是现在,我如何管理ListView中的项目?例如,如果我想更改视图的背景颜色,如果我将setBackgroundColor(Color.BLACK)放在View的构造函数中,它就不起作用。

这是我的自定义ArrayAdapter代码:

public class DataViewAdapter extends ArrayAdapter<DataView>{
Context context;
int layoutResourceId;
ArrayList<DataView> views;


public DataViewAdapter(Context context, int layoutResourceId,
        ArrayList<DataView> views) {
    super(context, layoutResourceId, views);
    this.context = context;
    this.layoutResourceId = layoutResourceId;
    this.views = views;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
    View row = convertView;
    ViewHolder holder = null;
    if(row == null){
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.view = (View)row.findViewById(R.id.dataView);
        row.setTag(holder);
    } else {
        holder = (ViewHolder)row.getTag();
    }
    DataView dataView = views.get(position);
    holder.view = dataView;
    return row;
}

static class ViewHolder{
    public View view;
}

}

另外,如果我需要将不同的数据值传递到每个View,该怎么办?在接受新数据值时,我的onDraw(Canvas canvas)内的DataView方法需要被触发。

编辑:DataView的代码

public class DataView extends View{
    private LinkedList<Integer> data;
    public DataView(Context context){
        super(context);
        data = new LinkedList<Integer>();
    }
    public void onDraw(Canvas canvas){
    // I need to plot according to data
    }
    public void pushData(int value){
        data.add(value);
        this.invalidate();
    }
}

2 个答案:

答案 0 :(得分:0)

您需要了解ListView的工作原理。它不仅具有视图数组 - 当用户向上/向下滚动以保留存储器时,这些视图被重用。您需要做的是将您的逻辑放入Adapter#getView method并重置您的背景,字体等。

当然,您需要扩展适配器以添加代码。使用Holder模式来保存对视图元素的引用也是非常有利的,因此您不必一次又一次地搜索这些元素。 Here's example关于你如何做到这一点

编辑: 因此,根据您的代码段 - 您没有正确使用Holder模式。假设您的列表项视图是LinearLayout,然后在您的Holder构造函数中执行类似

的操作
this.title = (TextView)view.findViewById(R.id.title);

然后在Adapter#getView你可以做像

这样的事情
View getView(int position, View view, ViewGroup parent) {
    ViewHolder holder = null;
    if(row == null){
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        view = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder(view);
        view.setTag(holder);
    } else {
        holder = (ViewHolder)view.getTag();
    }
    // MyData is one piece of data in the backing array
    MyData data = (MyData)getItem(position); 
    if (data.important) {
        view.setBackground(Color.red);
        holder.title.setText(data.title);
    }
    return view;
}

答案 1 :(得分:0)

通常你在适配器的getView()方法中创建/设置视图样式(也许你应该扩展BaseAdapter类而不是ArrayAdapter。但是看看!项目视图背景的处理这是一个非常特殊的章节。请参阅以下问题/答案: