我看到很多关于在适配器中使用convertView的有用性的帖子,比如this one,this one或this one(还有很多其他......)
我有一个ArrayAdapter,但我从头开始创建视图,使用一个简单的水平LinearLayout,我在其中添加了一些textview。文本视图的数量及其权重取决于列表中的位置。第一行可以有3台电视,第二行可以有7台,第三行可以有25台,每台都有不同的重量,具体取决于数据库。
在这种情况下,因为我不能膨胀任何东西,什么是convertView包含?
我应该使用它吗?如果是的话,我怎么可能?
编辑:这是我的代码:
@Override
public View getView(final int position, View convertView, ViewGroup parent){
LinearLayout layout = new LinearLayout(context);
for (int i = 0; i < totalTVNumber; i++) {
LifeEvent event = getEventFromDB(cost, position);
if (event != null) {
TextView eventTV = event.getTextView(getContext());
eventTV.setLayoutParams(new LinearLayout.LayoutParams(0, 100, weight));//0 en width sinon weight n'est pas pris en compte !!
layout.addView(eventTV);
}
}
}
答案 0 :(得分:2)
什么是convertView包含?
它包含您从头开始创建的过去View
,已滚动屏幕并且有资格进行回收。
我应该使用它吗?
是的,请。
如果是的话,我怎么可能?
与其他人一样。您直接创建视图而不是通过膨胀这一事实无关紧要。
所以,你可以这样做:
class YourAdapter extends ArrayAdapter<Whatever> {
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
if (convertView==null) {
convertView=newView(parent);
}
bindView(position, convertView);
return(convertView);
}
private View newView(ViewGroup parent) {
// create and return your new View
}
private void bindView(int position, View row) {
// populate the widgets of your new or recycled view
}
}
答案 1 :(得分:0)
ArrayAdapter会自动为您回收视图。因此,在Array Adapter的情况下,您不需要自己处理。请参考我从ArrayAdapter.java中提取的以下代码。你可能会清楚这一点。
public View getView(int position, View convertView, ViewGroup parent) {
return createViewFromResource(mInflater, position, convertView, parent, mResource);
}
private View createViewFromResource(LayoutInflater inflater, int position, View convertView,
ViewGroup parent, int resource) {
View view;
TextView text;
if (convertView == null) {
view = inflater.inflate(resource, parent, false);
} else {
view = convertView;
}
try {
if (mFieldId == 0) {
// If no custom field is assigned, assume the whole resource is a TextView
text = (TextView) view;
} else {
// Otherwise, find the TextView field within the layout
text = (TextView) view.findViewById(mFieldId);
}
} catch (ClassCastException e) {
Log.e("ArrayAdapter", "You must supply a resource ID for a TextView");
throw new IllegalStateException(
"ArrayAdapter requires the resource ID to be a TextView", e);
}
T item = getItem(position);
if (item instanceof CharSequence) {
text.setText((CharSequence)item);
} else {
text.setText(item.toString());
}
return view;
}