我希望我的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();
}
}
答案 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
。但是看看!项目视图背景的处理这是一个非常特殊的章节。请参阅以下问题/答案: