0

我希望我ListView的每个项目都持有View,因此我编写了自己的ArrayAdapter. 也就是说, myListViewViewnow 而不是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)my 内部的方法。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();
    }
}
4

2 回答 2

0

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

于 2012-11-13T20:15:30.860 回答
0

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

当然,您需要扩展适配器以添加您的代码。使用 Holder 模式来保存对视图元素的引用也是非常可取的,这样您就不必一次又一次地搜索这些元素。这是有关如何执行此操作的示例

编辑:所以根据您的代码片段 - 您没有正确使用 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;
}
于 2012-11-13T20:13:32.000 回答