我已经创建了自己的适配器,它扩展了ArrayAdapter ...问题是,我在列表中有3种类型的可能行,并且通过快速滚动某些行不正确,我认为因为“回收机制”与android views ...我在StackOverflow上阅读了很多教程,但我仍然有这个问题。 我的代码有问题吗? (代码没有最优化,我总是在功能正确时优化它)。你可以帮我吗?谢谢!
我的ArrayAdapter类:
package com.example.birthdayReminder;
import java.util.List;
import android.app.Activity;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
public class InteractiveArrayAdapter extends ArrayAdapter<Human> {
private final List<Human> list;
private final Activity context;
private int TYPE = 0;
ViewHolder holder;
public InteractiveArrayAdapter(Activity context, List<Human> list) {
super(context, R.layout.programlistview_row_layout, list);
this.context = context;
this.list = list;
}
static class ViewHolder {
protected TextView text;
protected TextView birthDate;
protected TextView daysToBirthDate;
protected TextView daysToBirthDateValue;
protected CheckBox checkbox;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//View view = null;
Human h = list.get(position);
holder = null;
TYPE = getItemViewType(position);
//System.out.println("getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
//LayoutInflater inflator = context.getLayoutInflater();
LayoutInflater inflator = LayoutInflater.from(getContext());
holder = new ViewHolder();
switch(TYPE){
case 0:
convertView = inflator.inflate(R.layout.programlistview_row_layout_birthday, parent, false);
break;
case 1:
convertView = inflator.inflate(R.layout.programlistview_row_layout_text_sentence, parent, false);
break;
case 2:
convertView = inflator.inflate(R.layout.programlistview_row_layout, parent, false);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
((ViewHolder) convertView.getTag()).checkbox.setTag(list.get(position));
}
holder.text = (TextView) convertView.findViewById(R.id.label);
holder.birthDate = (TextView) convertView.findViewById(R.id.birthDate);
holder.checkbox = (CheckBox) convertView.findViewById(R.id.check);
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Human element = (Human) holder.checkbox.getTag();
element.setSelected(buttonView.isChecked());
}
});
convertView.setTag(holder);
holder.checkbox.setTag(h);
holder.text.setText(h.getName() + " " + h.getLastName());
holder.text.setTypeface(null, Typeface.BOLD);
holder.birthDate.setText(" Birthday: " + String.valueOf(h.getBirthDate()));
switch(TYPE){
case 0:
holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);
if(h.getAge() == 1)
holder.daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " year old today!");
else
holder.daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " years old today!");
break;
case 1:
holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);
if(h.getAge() == 0){
holder.daysToBirthDate.setText(" ... was born today!");
}
else if(h.getAge() < 0)
holder.daysToBirthDate.setText(" ... was not born yet!");
break;
case 2:
holder.daysToBirthDateValue = (TextView) convertView.findViewById(R.id.daysTobirthDate_value);
holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);
holder.daysToBirthDate.setText(" Days to birthday: ");
holder.daysToBirthDateValue.setText(String.valueOf(h.getDaysToBirthDate()));
break;
}
holder.checkbox.setChecked(h.isSelected());
return convertView;
}
@Override
public int getViewTypeCount(){
return 3;
}
@Override
public int getItemViewType(int position){
Human h = list.get(position);
if (h.getDaysToBirthDate() == 0 && h.getAge() > 0){
TYPE = 0;
}
else if((h.getDaysToBirthDate() == 0 && h.getAge() == 0) || (h.getDaysToBirthDate() == 0 && h.getAge() < 0) || (h.getDaysToBirthDate() != 0 && h.getAge() < 0)){
TYPE = 1;
}
else if(h.getDaysToBirthDate() != 0 && h.getAge() >= 1){
TYPE = 2;
}
return TYPE;
}
@Override
public int getCount(){
return list.size();
}
@Override
public Human getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/*
//private class AnimalAdapter extends BaseAdapter {
final List<com.example.birthdayReminder.row.Row> rows;
InteractiveArrayAdapter(Activity context, List<Human> humans) {
super(context, R.layout.programlistview_row_layout);
//super(context, R.layout.programlistview_row_layout, list);
rows = new ArrayList<com.example.birthdayReminder.row.Row>();//member variable
for (Human h : humans) {
if (h.getDaysToBirthDate() == 0 && h.getAge() > 0){
rows.add((com.example.birthdayReminder.row.Row) new BirthdayRow(LayoutInflater.from(context), h));
} else if((h.getDaysToBirthDate() == 0 && h.getAge() == 0) || (h.getDaysToBirthDate() == 0 && h.getAge() < 0) || (h.getDaysToBirthDate() != 0 && h.getAge() < 0)){
rows.add((com.example.birthdayReminder.row.Row) new TodayFutureRow(LayoutInflater.from(context), h));
} else if(h.getDaysToBirthDate() != 0 && h.getAge() >= 1){
rows.add((com.example.birthdayReminder.row.Row) new NonBirthdayRow(LayoutInflater.from(context), h));
}
}
}
@Override
public int getViewTypeCount() {
return com.example.birthdayReminder.row.RowType.values().length;
}
@Override
public int getItemViewType(int position) {
return rows.get(position).getViewType();
}
public int getCount() {
return rows.size();
}
//public Object getItem(int position) {
// return position;
//}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
return rows.get(position).getView(convertView);
}
//}
*/
}
答案 0 :(得分:0)
删除持有人并使用您自己的逻辑来检查项目。因为如果你把持有人ur * 视图将在listview中重复使用,那么你的数据将被折叠。好用的持有人(内存)观点)。但是对于你的要求你不能使用持有人。 *
public class InteractiveArrayAdapter extends ArrayAdapter<Human> {
private final List<Human> list;
private final Activity context;
private int TYPE = 0;
private LayoutInflater l_Inflater;
public ItemListBaseAdapter(Context context,
List<Human> list) {
this.context = context;
this.list = list;
}
public int getCount() {
return list.size();
}
public Object getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Human h = list.get(position);
TYPE = getItemViewType(position);
//System.out.println("getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
//LayoutInflater inflator = context.getLayoutInflater();
LayoutInflater inflator = LayoutInflater.from(getContext());
switch(TYPE){
case 0:
convertView = inflator.inflate(R.layout.programlistview_row_layout_birthday, parent, false);
break;
case 1:
convertView = inflator.inflate(R.layout.programlistview_row_layout_text_sentence, parent, false);
break;
case 2:
convertView = inflator.inflate(R.layout.programlistview_row_layout, parent, false);
break;
}
}
text = (TextView) convertView.findViewById(R.id.label);
birthDate = (TextView) convertView.findViewById(R.id.birthDate);
checkbox = (CheckBox) convertView.findViewById(R.id.check);
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});
checkbox.setTag(h);
text.setText(h.getName() + " " + h.getLastName());
text.setTypeface(null, Typeface.BOLD);
birthDate.setText(" Birthday: " + String.valueOf(h.getBirthDate()));
switch(TYPE){
case 0:
daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);
if(h.getAge() == 1)
daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " year old today!");
else
holder.daysToBirthDate.setText(" ... is " + (int)(h.getAge()) + " years old today!");
break;
case 1:
holder.daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);
if(h.getAge() == 0){
holder.daysToBirthDate.setText(" ... was born today!");
}
else if(h.getAge() < 0)
holder.daysToBirthDate.setText(" ... was not born yet!");
break;
case 2:
daysToBirthDateValue = (TextView) convertView.findViewById(R.id.daysTobirthDate_value);
daysToBirthDate = (TextView) convertView.findViewById(R.id.daysTobirthDate);
daysToBirthDate.setText(" Days to birthday: ");
holder.daysToBirthDateValue.setText(String.valueOf(h.getDaysToBirthDate()));
break;
}
holder.checkbox.setChecked(h.isSelected());
return convertView;
}
@Override
public int getViewTypeCount(){
return 3;
}
@Override
public int getItemViewType(int position){
Human h = list.get(position);
if (h.getDaysToBirthDate() == 0 && h.getAge() > 0){
TYPE = 0;
}
else if((h.getDaysToBirthDate() == 0 && h.getAge() == 0) || (h.getDaysToBirthDate() == 0 && h.getAge() < 0) || (h.getDaysToBirthDate() != 0 && h.getAge() < 0)){
TYPE = 1;
}
else if(h.getDaysToBirthDate() != 0 && h.getAge() >= 1){
TYPE = 2;
}
return TYPE;
}
}