我已經創建了我自己的適配器,它擴展了ArrayAdapter ...問題是,我在列表中有3種可能的行,並且通過快速滾動某些行是不正確的,我認爲是因爲「回收機制」 Android視圖...我閱讀了很多關於StackOverflow的教程,但我仍然遇到這個問題。 我的代碼有問題嗎? (代碼沒有最優化,我總是在功能正確時對其進行優化)。你能幫我嗎?謝謝!ArrayAdapter和3種不同類型的行。沒有工作
我一個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);
}
//}
*/
}
u能請您分享如何將要顯示的數據,目前如何U所得到的數據的屏幕截圖。 – Ruban
如果你的convertView不爲null,你不更新佈局。所以convertView沒有得到更新。通過臨時刪除if條件'convertView == null'它應該看起來o.k.然後你可以實現一個方法來檢查convertView的類型是否正常。 – Christian
首先,不要在'getItemViewType()'和'getView()'方法之間共享TYPE變量。其次確保'getItemViewType()'方法中的'if'子句覆蓋了所有**可能的情況,所以你不會退出具有指向某個隨機值的'TYPE'的方法。 – Luksprog