Benutzerdefinierte ListView mit Datum als SectionHeader (benutzter benutzerdefinierter SimpleCursorAdapter)

Ich möchte ListView mit Datum als SectionHeader anzeigen.

Was ich habe: Ich zeige ListView von sqlite Datenbank mit benutzerdefiniertem SimpleCursorAdapter.

  • Wie füge ich das Objekt am Anfang der Liste in ArrayAdapter hinzu?
  • Android Wie lese ich BLE Eigenschaften Readable Writable Notifizierbare GATT Eigenschaften
  • Dynamische Einstellung der übergeordneten Aktivität
  • Android listview Anzeige aller verfügbaren Artikel ohne Scroll mit statischen Header
  • Vermeidung von Verschlüsselungsschlüssel in Android-Anwendung
  • IllegalStateException bei MediaCodec.configure Android
  • Meine benutzerdefinierte SimpleCursorAdapter ist:

    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 Ergebnisse bisher:

    MergeAdapter

    Jeff Sharkey

    Erstaunliche ListView

    SO Frage

    Problem: Ich möchte die Listenansicht mit Datum als Abschnittsüberschriften anzeigen. Natürlich Datumswerte kommen aus sqlite Datenbank.

    Kann mir jemand bitte führen, wie kann ich diese Aufgabe erreichen?

    Oder geben Sie mir eine Beispiel-Code oder exakte (wie) Code in Bezug auf die gleiche.

    Bearbeitet nach Graham Borald's Antwort (Das funktioniert gut, aber es war eine schnelle Lösung.)

     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; } } 

    Bearbeitet nach CommonsWare's Antwort

     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(); }*/ } 

    Ich Cursor date=adapter.fetchTodo(id); Null Pointer Exception an der Linie: Cursor date=adapter.fetchTodo(id); Scheint, dass der Cursor keine Daten erhält.

  • Xml Puller Vermögenswerte xml
  • So legen Sie eine benutzerdefinierte Schriftart auf den Titel in der Symbolleiste Android
  • Wie bekomme ich Informationen über Android-Batterie-Nutzung durch Anwendung
  • Android: Wie Handle Nachrichtenfehler vom Server mit Volley?
  • Keine Implementierung für native gefunden
  • Mit dem Android Google Maps API v2 als Viewer von Offline-Kacheln: Ist es möglich?
  • 3 Solutions collect form web for “Benutzerdefinierte ListView mit Datum als SectionHeader (benutzter benutzerdefinierter SimpleCursorAdapter)”

    Bei weitem der einfachste Weg, dies zu tun ist, um die Datumskopfansicht in jedem Element einzubetten. Dann ist alles, was Sie in bindView tun müssen, das Datum der vorherigen Zeile mit dem Datum dieser Zeile vergleichen und das Datum ausblenden, wenn es das gleiche ist. Etwas wie das:

      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); } 

    Kann mir jemand bitte führen, wie kann ich diese Aufgabe erreichen?

    Mit erheblichen Schmerzen

    Du musst deine eigene Unterklasse von CursorAdapter (oder evtl. SimpleCursorAdapter ) SimpleCursorAdapter . In dieser Unterklasse müssen Sie die Anzahl der Header-Zeilen berechnen und die getCount() anpassen. Sie müssen getViewTypeCount() die richtige Nummer zurückgeben. Sie müssen die Positionen dieser Header-Zeilen identifizieren und getItemViewType() , newView() und bindView() , um mit Ihren Header-Zeilen umzugehen und den position für Detailzeilen anzupassen, um die Anzahl der Header zu berücksichtigen, die voraus sind Von dieser Zeile, so dass Sie die richtige Cursor Position zu arbeiten mit. Möglicherweise müssen andere Anpassungen auch sein, aber das ist ziemlich sicher.

    Wenn mich niemand schlägt, werde ich wahrscheinlich eines davon im nächsten Jahr schreiben, sobald es für ein Projekt von mir benötigt wird.

    Es ist sehr einfach für die Umsetzung:

     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(); } 

    Und show / hide header in benutzerdefinierten CommentCell-Ansicht:

      public void showHeader(boolean show, String currentDate) { if (show) { headerTextview.setVisibility(VISIBLE); headerTextview.setText(currentDate); } else { headerTextview.setVisibility(GONE); } } 

    String-Datum erstellen:

     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; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.