SectionHeaderとしてDateを指定してListViewを表示したいと思います。
私が持っているもの:カスタムSimpleCursorAdapterを使用してsqliteデータベースからListViewを表示しています。
私のカスタムSimpleCursorAdapterは:
_public class DomainAdapter extends SimpleCursorAdapter{
private Cursor dataCursor;
private LayoutInflater mInflater;
public DomainAdapter(Context context, int layout, Cursor dataCursor, String[] from,
int[] to) {
super(context, layout, dataCursor, from, to);
this.dataCursor = dataCursor;
mInflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.todo_row, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.label);//Task Title
holder.text2 = (TextView) convertView.findViewById(R.id.label2);//Task Date
holder.img = (ImageView) convertView.findViewById(R.id.task_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
dataCursor.moveToPosition(position);
int title = dataCursor.getColumnIndex("title");
String task_title = dataCursor.getString(title);
int title_date = dataCursor.getColumnIndex("day");
String task_day = dataCursor.getString(title_date);
int description_index = dataCursor.getColumnIndex("priority");
int priority = dataCursor.getInt(description_index);
holder.text1.setText(task_title);
holder.text2.setText(task_day);
if(priority==1) holder.img.setImageResource(R.drawable.redbutton);
else if(priority==2) holder.img.setImageResource(R.drawable.bluebutton);
else if(priority==3)holder.img.setImageResource(R.drawable.greenbutton);
else holder.img.setImageResource(R.drawable.redbuttonchecked);
return convertView;
}
static class ViewHolder {
TextView text1;
TextView text2;
ImageView img;
}
}
_
これまでのGoogleの結果:
問題:セクションヘッダーとして日付を含むリストビューを表示したい。もちろん、日付の値はsqliteデータベースから取得されます。
誰かが私にこのタスクを達成する方法を教えてもらえますか?.
または、サンプルコードまたはそれに関連する正確な(類似の)コードを提供してください。
編集済みGraham Boraldの回答によると(これは正常に機能します。ただし、迅速な修正でした。)
_public class DomainAdapter extends SimpleCursorAdapter{
private Cursor dataCursor;
private LayoutInflater mInflater;
public DomainAdapter(Context context, int layout, Cursor dataCursor, String[] from,
int[] to) {
super(context, layout, dataCursor, from, to);
this.dataCursor = dataCursor;
mInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.tasks_row, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.label);//Task Title
holder.text2 = (TextView) convertView.findViewById(R.id.label2);//Task Date
holder.img = (ImageView) convertView.findViewById(R.id.taskImage);
holder.sec_hr=(TextView) convertView.findViewById(R.id.sec_header);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
dataCursor.moveToPosition(position);
int title = dataCursor.getColumnIndex("title");
String task_title = dataCursor.getString(title);
int title_date = dataCursor.getColumnIndex("due_date");
String task_day = dataCursor.getString(title_date);
int description_index = dataCursor.getColumnIndex("priority");
int priority = dataCursor.getInt(description_index);
String prevDate = null;
if (dataCursor.getPosition() > 0 && dataCursor.moveToPrevious()) {
prevDate = dataCursor.getString(title_date);
dataCursor.moveToNext();
}
if(task_day.equals(prevDate))
{
holder.sec_hr.setVisibility(View.GONE);
}
else
{
holder.sec_hr.setText(task_day);
holder.sec_hr.setVisibility(View.VISIBLE);
}
holder.text1.setText(task_title);
holder.text2.setText(task_day);
if(priority==1) holder.img.setImageResource(R.drawable.redbutton);
else if(priority==2) holder.img.setImageResource(R.drawable.bluebutton);
else if(priority==3)holder.img.setImageResource(R.drawable.greenbutton);
else holder.img.setImageResource(R.drawable.redbuttonchecked);
return convertView;
}
static class ViewHolder {
TextView text1;
TextView text2;
TextView sec_hr;
ImageView img;
}
}
_
編集済みCommonsWareの回答によると
_public class DomainAdapter extends SimpleCursorAdapter{
private Cursor dataCursor;
private TodoDbAdapter adapter;
private LayoutInflater mInflater;
boolean header;
String last_day;
public DomainAdapter(Context context, int layout, Cursor dataCursor, String[] from,
int[] to) {
super(context, layout, dataCursor, from, to);
this.dataCursor = dataCursor;
mInflater = LayoutInflater.from(context);
header=true;
adapter=new TodoDbAdapter(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
TitleHolder title_holder = null;
if(getItemViewType(position)==1)
{
//convertView= mInflater.inflate(R.layout.todo_row, parent, false);
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.todo_row, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.label);//Task Title
holder.text2 = (TextView) convertView.findViewById(R.id.label2);//Task Date
holder.img = (ImageView) convertView.findViewById(R.id.task_icon);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
dataCursor.moveToPosition(position);
int title = dataCursor.getColumnIndex("title");
String task_title = dataCursor.getString(title);
int title_date = dataCursor.getColumnIndex("day");
String task_day = dataCursor.getString(title_date);
int description_index = dataCursor.getColumnIndex("priority");
int priority = dataCursor.getInt(description_index);
holder.text1.setText(task_title);
holder.text2.setText(task_day);
if(priority==1) holder.img.setImageResource(R.drawable.redbutton);
else if(priority==2) holder.img.setImageResource(R.drawable.bluebutton);
else if(priority==3)holder.img.setImageResource(R.drawable.greenbutton);
else holder.img.setImageResource(R.drawable.redbuttonchecked);
}
else
{
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.section_header, null);
title_holder = new TitleHolder();
title_holder.datee = (TextView) convertView.findViewById(R.id.sec_header);//Task Title
convertView.setTag(title_holder);
}
else
{
title_holder = (TitleHolder) convertView.getTag();
}
dataCursor.moveToPosition(position);
int title_date = dataCursor.getColumnIndex("day");
String task_day = dataCursor.getString(title_date);
title_holder.datee.setText(task_day);
}
return convertView;
}
static class ViewHolder {
TextView text1;
TextView text2;
ImageView img;
}
static class TitleHolder{
TextView datee;
}
@Override
public int getCount() {
return dataCursor.getCount()+1; //just for testing i took no. of headers=1
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
dataCursor.moveToPosition(position);
**Long id=dataCursor.getLong(position);**
Cursor date=adapter.fetchTodo(id);
int title_date = date.getColumnIndex("day");
String task_day = date.getString(title_date);
Log.i("tag",task_day);
if(last_day.equals(task_day))
return 1;//Display Actual Row
else
{
last_day=task_day;//Displaying Header
return 0;
}
}
/*
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view;
if(getItemViewType(cursor.getPosition())==1)
view= mInflater.inflate(R.layout.todo_row, parent, false);
else
view=mInflater.inflate(R.layout.section_header,parent, false);
return view;
}
@Override
public void bindView(View convertView, Context context, Cursor cursor) {
long id = cursor.getPosition();
}*/
}
_
次の行でNull Pointer Exceptionが発生しています:Cursor date=adapter.fetchTodo(id);
Cursorがデータを取得していないようです。
これを行う最も簡単な方法は、日付ヘッダービューを埋め込むことですすべてのアイテムに。次に、bindView
で行う必要があるのは、前の行の日付をこの行の日付と比較し、同じ場合は日付を非表示にすることだけです。このようなもの:
String thisDate = cursor.getString(dateIndex);
String prevDate = null;
// get previous item's date, for comparison
if (cursor.getPosition() > 0 && cursor.moveToPrevious()) {
prevDate = cursor.getString(dateIndex);
cursor.moveToNext();
}
// enable section heading if it's the first one, or
// different from the previous one
if (prevDate == null || !prevDate.equals(thisDate)) {
dateSectionHeaderView.setVisibility(View.VISIBLE);
} else {
dateSectionHeaderView.setVisibility(View.GONE);
}
誰かが私にこのタスクを達成する方法を教えてもらえますか?.
かなりの痛みを伴う。
CursorAdapter
(または場合によってはSimpleCursorAdapter
)の独自のサブクラスを作成する必要があります。そのサブクラスでは、ヘッダー行の数を計算し、一致するようにgetCount()
を調整する必要があります。 getViewTypeCount()
に正しい数値を返すようにする必要があります。これらのヘッダー行の位置を特定し、getItemViewType()
、newView()
、およびbindView()
を調整して、ヘッダー行を処理し、position
詳細行の値は、その行の前にあるヘッダーの数を考慮に入れるため、適切なCursor
位置を操作できます。他の調整も必要かもしれませんが、それらはかなり確実です。
誰も私に勝てないのなら、私のプロジェクトに必要になったら、おそらく来年にこれらの1つを書くでしょう。
実装は非常に簡単です。
public class ChatAdapter extends NoteBaseAdapter {
private Cursor mCursor;
/**
* List of notes to showToast
*/
public int getCount() {
int count = 0;
if (mCursor != null)
count = mCursor.getCount();
return count;
}
public Comment getItem(int position) {
mCursor.moveToPosition(position);
Comment comment = Comment.fromCursor(mCursor);
return comment;
}
public long getItemId(int position) {
return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final Comment comment = getItem(position);
CommentCell cellView = null;
if (convertView == null) {
cellView = new CommentCell(parent.getContext());
cellView.setup(elementsColor, backgroundColor);
} else
cellView = (CommentCell) convertView;
cellView.setComment(comment);
boolean showHeader = false;
String currentDate = null;
if (position > 0 && position < getCount()) {
int previousPosition = position - 1;
Comment previousComment = getItem(previousPosition);
currentDate = comment.headerDate();
String previousDate = previousComment.headerDate();
showHeader = !currentDate.equalsIgnoreCase(previousDate);
} else {
showHeader = true;
currentDate = comment.headerDate();
}
cellView.showHeader(showHeader, currentDate);
return cellView;
}
public void update(long itemUniqueId) {
mCursor = Comment.fetchResultCursor(itemUniqueId);
notifyDataSetChanged();
}
カスタムCommentCellビューでヘッダーを表示/非表示にします。
public void showHeader(boolean show, String currentDate) {
if (show) {
headerTextview.setVisibility(VISIBLE);
headerTextview.setText(currentDate);
} else {
headerTextview.setVisibility(GONE);
}
}
文字列の日付を作成します。
public String headerDate() {
String createDateStr = null;
if (createDate != Consts.NONE_LONG)
createDateStr = TimeUtil.dateToString("dd MMMM", new Date(createDate));
return createDateStr;
}
public static String dateToString(String format, Date date) {
DateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault());
String text = dateFormat.format(date);
return text;
}