Нумерация строк в ListView

Как вывести номер строки перед содержимым в ListView? Знаю, что можно получить getitemPosition, но в OnItemClick, но как выводить на экран не знаю. Ниже код заполнения listView с помощью simpleCursorAdapter:

String[] lines = new String[] {"title", "status", "_id"};
    cursor = mDB.query("requests", lines,  "id_ins = ?", new String[] {String.valueOf(user)}, null, null, null);
    cursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.cursor_listview, cursor, lines, new int[]{R.id.title, R.id.status}, 0);
    list.setAdapter(cursorAdapter);

Нужно в каждой строке выводит текущую позицию listView.


Ответы (2 шт):

Автор решения: woesss

Есть несколько вариантов это сделать. Один из них: у старых добрых Simple- адаптеров есть возможность назначить ViewBinder (коллбэк заполнения содержимого строк) - используем его:

String[] lines = new String[] {"title", "status", "_id"};
cursor = mDB.query("requests", lines,  "id_ins = ?", new String[] {String.valueOf(user)}, null, null, null);

// добавляем в массив "to" id вью, в которую будем выводить номер строки
// не забываем, что массив "from" должен быть не меньшей длины и содержать валидные имена колонок
cursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.cursor_listview, cursor, lines,
                                        new int[]{R.id.title, R.id.status, R.id.rowNum}, 0);
cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
        // если id совпадает с нужным, приводим к нужному типу и вставляем значение
        if (view.getId() == R.id.rowNum) {
            TextView tv = (TextView) view;
            // getPosition() возвращает индекс текущей строки
            // (нумерация с 0) если нужно с 1, то прибавляем единицу
            tv.setText(String.valueOf(cursor.getPosition() + 1));
            // возвращая true, говорим адаптеру, что мы сами вставили значение
            return true;
        }
        // иначе говорим адаптеру использовать его стандартную логику заполнения значения
        // если не хотим заполнять остальные вью сами
        return false;
    }
});
list.setAdapter(cursorAdapter);
→ Ссылка
Автор решения: Pempium4

Переопределил в SimpleCursorAdapter метод bindView, теперь всё работает как мне нужно.

public class CustomCursorAdapter extends SimpleCursorAdapter {

    public CustomCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        super.bindView(view, context, cursor);
        LinearLayout layout = (LinearLayout) view;
        TextView textView = (TextView) layout.findViewById(R.id.item);
        textView.setText(String.valueOf(cursor.getPosition()+1) + ". ");
    }
}
→ Ссылка