我只有一個充氣的佈局。在向listview添加新項目後,我如下捕獲這個exeption,當我嘗試滾動時,它會發生。如果getViewTypeCount()將返回1,我將有一個大的problem爲什麼getViewTypeCount()返回不同的值?
D/countOfType﹕ getViewTypeCount() = 8
D/countOfType﹕ getViewTypeCount() = 7
java.lang.ArrayIndexOutOfBoundsException: length=9; index=9
at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6563)
這裏是我的適配器代碼
@Override
public View getView(final int position, final View convertView, ViewGroup parent) {
View row = convertView;
final Tracker tracker = trackerList.get(position);
final Thread thread = tracker.getThread();
ViewHolder holder;
long days,hours,minutes,seconds;
long eDays,eHours,eMins,eSecs;
if(row == null){
row = inflater.inflate(R.layout.list_item,parent,false);
holder = new ViewHolder(row);
row.setTag(holder);
}else {
holder = (ViewHolder) row.getTag();
}
//изнальначальный вид
final ViewHolder finalHolder = holder;
finalHolder.start.setVisibility(View.VISIBLE);
finalHolder.stop.setVisibility(View.GONE);
finalHolder.name.setText(tracker.getName());
Log.d("TrackAdapter","getView() = "+position);
if(tracker.getElapsedTime()!=0 && tracker.getLimitTime()==0){//если прошедшее время !=0 и таймер без лимита
days = tracker.getElapsedTime()/86400000;
hours = (tracker.getElapsedTime()/3600000)%24;
minutes = (tracker.getElapsedTime()/60000)%60;
seconds = (tracker.getElapsedTime()/1000)%60;
if(days!=0)
finalHolder.days.setText(Util.concat(days <= 9 ? 0 : "", days));
if(hours!=0)
finalHolder.hours.setText(Util.concat(hours <=9 ?0:"",hours));
if(minutes!=0)
finalHolder.minutes.setText(Util.concat(minutes<=9?0:"",minutes));
if(seconds!=0)
finalHolder.seconds.setText(Util.concat(seconds<=9?0:"",seconds));
}else{
if(tracker.getIsFinished()){//если таск закончен, дошел до лимита
hours = (tracker.getLimitTime()/3600000)%24;
minutes = (tracker.getLimitTime()/60000)%60;
seconds = (tracker.getLimitTime()/1000)%60;
finalHolder.start.setVisibility(View.GONE);
finalHolder.textFinish.setVisibility(View.VISIBLE);
finalHolder.stop.setVisibility(View.GONE);
if(seconds!=60)
finalHolder.seconds.setText(Util.concat(seconds<=9?0:"",seconds));
if(minutes!=60)
finalHolder.minutes.setText(Util.concat(minutes<=9?0:"",minutes));
if(hours!=24)
finalHolder.hours.setText(Util.concat(hours <= 9 ? 0 : "", hours));
}else{
if(tracker.getLimitTime()!=0){//если установлен лимит, но еще не дошел до конца
days = tracker.getLimitTime()/86400000;
hours = (tracker.getLimitTime()/3600000)%24;
minutes = (tracker.getLimitTime()/60000)%60;
finalHolder.textLimit.setVisibility(View.VISIBLE);
finalHolder.limHours.setVisibility(View.VISIBLE);
finalHolder.limDay.setVisibility(View.VISIBLE);
finalHolder.limMin.setVisibility(View.VISIBLE);
finalHolder.limDay.setText(Util.concat(days <= 9 ? 0 : "", days, ":"));
finalHolder.limHours.setText(Util.concat(hours <= 9 ? 0 : "", hours, ":"));
finalHolder.limMin.setText(Util.concat(minutes<=9?0:"",minutes));
eDays = (tracker.getElapsedTime()/86400000);
eHours = (tracker.getElapsedTime()/3600000)%24;
eMins = (tracker.getElapsedTime()/60000)%60;
eSecs = (tracker.getElapsedTime()/1000)%60;
if(eSecs!=0)
finalHolder.seconds.setText(Util.concat(eSecs<=9?0:"",eSecs));
if(eMins!=0)
finalHolder.minutes.setText(Util.concat(minutes<=9?0:"",eMins));
if(eHours!=0)
finalHolder.hours.setText(Util.concat(hours<= 9 ? 0 : "", eHours));
if(eSecs!=0)
finalHolder.days.setText(Util.concat(days<= 9 ? 0 : "", eDays));
}else {
finalHolder.textLimit.setVisibility(View.GONE);
finalHolder.limHours.setVisibility(View.GONE);
finalHolder.limDay.setVisibility(View.GONE);
finalHolder.limMin.setVisibility(View.GONE);
}
}
}
if(tracker.getIsStart() && !tracker.getIsFinished()) {//если был стартован
finalHolder.start.setVisibility(View.GONE);
finalHolder.stop.setVisibility(View.VISIBLE);
}
tracker.setHolder(finalHolder);
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btStart:
tracker.setStartTime(System.currentTimeMillis());
tracker.setIsStart(true);
tracker.setHolder(finalHolder);
finalHolder.start.setVisibility(View.GONE);
finalHolder.stop.setVisibility(View.VISIBLE);
if(tracker.getUpdateTime()==0)
thread.start();
else
tracker.getThread().start();
break;
case R.id.btStop:
tracker.setLastPause(tracker.getUpdateTime());
finalHolder.stop.setVisibility(View.GONE);
finalHolder.start.setVisibility(View.VISIBLE);
tracker.setIsStart(false);
break;
}
}
};
finalHolder.start.setOnClickListener(onClickListener);
finalHolder.stop.setOnClickListener(onClickListener);
return row;
}
@Override
public int getViewTypeCount() {
Log.d("countOfType","getViewTypeCount() = "+getCount());
if(getCount()==0)
return super.getViewTypeCount();
else
return getCount();
//return 1;
}
@Override
public int getItemViewType(int position) {
return position;
}
static class ViewHolder{
@InjectView(R.id.tvName) TextView name;
@InjectView(R.id.tvDays) TextView days;
@InjectView(R.id.tvHours) TextView hours;
@InjectView(R.id.tvMinutes) TextView minutes;
@InjectView(R.id.tvSeconds) TextView seconds;
@InjectView(R.id.btStart) ButtonFloatSmall start;
@InjectView(R.id.btStop) ButtonFloatSmall stop;
@InjectView(R.id.txtFinish) TextView textFinish;
@InjectView(R.id.txtLimit) TextView textLimit;
@InjectView(R.id.limDay) TextView limDay;
@InjectView(R.id.limHours) TextView limHours;
@InjectView(R.id.limMin) TextView limMin;
public ViewHolder(View view){
ButterKnife.inject(this,view);
}
}
「爲什麼getViewTypeCount()返回不同的值?「 - 因爲你寫它返回不同的值。如果你想要它有一個固定值,返回一個固定值,而不是'getCount()'。 – CommonsWare
@CommonsWare 你是對的,但如果我將返回1,我的項目將與滾動 –
混合「我的項目將混合滾動」 - 這將指示您的'getView()'實現中的錯誤。修復錯誤。 – CommonsWare