Проблема DateIndexer
Итак, у меня есть страница недавних звонков. Я хочу разделить свои последние звонки по дате (в формате ММММ ДД, ГГГГ), но она не отображается должным образом. У меня появляется только первая дата, 17 декабря 2013 г., хотя последние три записи: 16 декабря 2013 г., 16 декабря 2013 г. и 13 декабря 2013 г.
Вот мой код для этого:
boolean needSeparator = false;
final int position = cursor.getPosition();
if(this.dateIndexer == null)
this.dateIndexer = new LinkedHashMap<String, Integer>();
sdf = new SimpleDateFormat("h:mm aa MMMM dd, yyyy", Locale.getDefault());
Date testDate;
try {
testDate = sdf.parse(date);
Calendar calDate = Calendar.getInstance();
calDate.setTime(testDate);
String day = String.valueOf(calDate.get(Calendar.DATE));
String month = calDate.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
String year = String.valueOf(calDate.get(Calendar.YEAR));
shortDate = month + " " + day + ", " + year;
if(!shortDate.equals(prDate)){
this.dateIndexer.put(shortDate, position);
prDate = shortDate;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Set<String> sectionDates = this.dateIndexer.keySet();
// create a list from the set to sort
ArrayList<String> sectionList = new ArrayList<String>(sectionDates);
this.sections = new String[sectionList.size()];
sectionList.toArray(this.sections);
if (position == 0) {
needSeparator = true;
} else {
cursor.moveToPosition(position - 1);
cursor.copyStringToBuffer(RecentQuery.COLUMN_DATE, mBuffer);
if (mBuffer.sizeCopied > 0 && holder.dateBuffer.sizeCopied > 0 && mBuffer.data[0] != holder.dateBuffer.data[0]) {
needSeparator = true;
}
cursor.moveToPosition(position);
}
if (needSeparator) {
holder.separator.setText(sectionList.get(sectionList.size() - 1));
holder.separator.setVisibility(View.VISIBLE);
} else {
holder.separator.setVisibility(View.GONE);
}
Любая помощь будет отличной. Спасибо
1 ответ
Решение
Я изменил буфера символов на строки, и это сработало. Это если заявление
if (mBuffer.sizeCopied > 0 && holder.dateBuffer.sizeCopied > 0 && mBuffer.data[0] != holder.dateBuffer.data[0]) {
needSeparator = true;
}
Был только принимая во внимание первый персонаж (как и должно быть). Я использовал это для своей страницы контактов, где я разделял только буквы. Так что изменение его для сравнения строк решило проблему.
Вот новый код
boolean needSeparator = false;
final int position = cursor.getPosition();
if(this.dateIndexer == null)
this.dateIndexer = new LinkedHashMap<String, Integer>();
sdf = new SimpleDateFormat("h:mm aa MMMM dd, yyyy", Locale.getDefault());
try {
Calendar calDate = Calendar.getInstance();
calDate.setTime(sdf.parse(date));
String day = String.valueOf(calDate.get(Calendar.DATE));
String month = calDate.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
String year = String.valueOf(calDate.get(Calendar.YEAR));
shortDate = month + " " + day + ", " + year;
if(!shortDate.equals(prDate)){
this.dateIndexer.put(shortDate, position);
prDate = shortDate;
}
} catch (ParseException e) {
e.printStackTrace();
}
holder.dBuffer = shortDate;
Set<String> sectionDates = this.dateIndexer.keySet();
// create a list from the set to sort
ArrayList<String> sectionList = new ArrayList<String>(sectionDates);
this.sections = new String[sectionList.size()];
sectionList.toArray(this.sections);
if (position == 0) {
needSeparator = true;
} else {
cursor.moveToPosition(position - 1);
sdf = new SimpleDateFormat("h:mm aa MMMM dd, yyyy", Locale.getDefault());
try {
Calendar calDate = Calendar.getInstance();
calDate.setTime(sdf.parse(cursor.getString(RecentQuery.COLUMN_DATE)));
String day = String.valueOf(calDate.get(Calendar.DATE));
String month = calDate.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
String year = String.valueOf(calDate.get(Calendar.YEAR));
sBuffer = month + " " + day + ", " + year;
} catch (ParseException e) {
e.printStackTrace();
}
if (sBuffer.length() > 0 && holder.dBuffer.length() > 0 && !sBuffer.equals(holder.dBuffer)) {
needSeparator = true;
}
cursor.moveToPosition(position);
}
if (needSeparator) {
holder.separator.setText(String.valueOf(this.sections[this.sections.length - 1]));
holder.separator.setVisibility(View.VISIBLE);
} else {
holder.separator.setVisibility(View.GONE);
}