Использование собственного простогоCursorAdapter

Я пытаюсь получить доступ к списку действий с помощью пользовательского адаптера. Я пробовал его напрямую, не используя какой-либо пользовательский адаптер, он работал хорошо, но поскольку я хочу добавить больше функций в список, я хочу реализовать собственный адаптер. Теперь у меня есть попробовал, но я получаю пустой список без видимых данных. Список-активность

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

         String[] projection = {
                    MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.ARTIST,
                    MediaStore.Audio.Media.TITLE,
                    MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.DISPLAY_NAME,
                    MediaStore.Audio.Media.DURATION,

            };
            //query 

            musiccursor = this.managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,projection,selection,null,sortOrder);
            music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);


            int a[]= new int[]{R.id.TitleSong,R.id.Artist};


            Custom_Adapter adapter = new Custom_Adapter(this,R.layout.music_items, musiccursor, new String[]{MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST} ,a);

            this.setAdapter(adapter);

            }
    }

Пользовательский адаптер

    public class Custom_Adapter extends SimpleCursorAdapter {


    private Context mContext;
    private Context appContext;
    private int layout;
    private Cursor cr;
    private final LayoutInflater inflater;

    public Custom_Adapter(Context context,int layout, Cursor c,String[] from,int[] to) {
        super(context,layout,c,from,to);
        this.layout=layout;
        this.mContext = context;
        this.inflater=LayoutInflater.from(context);
        this.cr=c;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // TODO Auto-generated method stub
        super.bindView(view, context, cursor);
     view=inflater.inflate(layout, null, false);
        TextView titleS=(TextView)view.findViewById(R.id.TitleSong);
        TextView artistS=(TextView)view.findViewById(R.id.Artist);
        int Title_index;
        int Artist_index;
        cursor.moveToFirst();
        while(cursor.isLast()){

            Title_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
            Artist_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
            titleS.setText(cursor.getString(Title_index));
            artistS.setText(cursor.getString(Artist_index));
            cr.moveToNext();
            }

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        return convertView;
    }
}

person Himanshu Verma    schedule 17.07.2013    source источник


Ответы (2)


При расширении адаптера курсора вы должны переопределить методы bindView и newView. Метод bindView используется для привязки всех данных к заданному представлению, например для установки текста в TextView. Метод newView используется для создания нового представления и его возврата, в этот момент вы не привязываете никаких данных к представлению. Большинство адаптеров используют функцию getView, но при расширении адаптера курсора следует использовать bindView и newView.

    public class Custom_Adapter extends SimpleCursorAdapter {

            private Context mContext;
            private Context appContext;
            private int layout;
            private Cursor cr;
            private final LayoutInflater inflater;

            public Custom_Adapter(Context context,int layout, Cursor c,String[] from,int[] to) {
                super(context,layout,c,from,to);
                this.layout=layout;
                this.mContext = context;
                this.inflater=LayoutInflater.from(context);
                this.cr=c;
            }

            @Override
            public View newView (Context context, Cursor cursor, ViewGroup parent) {
                    return inflater.inflate(layout, null);
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor) {
                super.bindView(view, context, cursor);
                TextView titleS=(TextView)view.findViewById(R.id.TitleSong);
                TextView artistS=(TextView)view.findViewById(R.id.Artist);

                int Title_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
                int Artist_index=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);

                titleS.setText(cursor.getString(Title_index));
                artistS.setText(cursor.getString(Artist_index));

            }

    }
person Bobbake4    schedule 17.07.2013
comment
Я могу получить данные в виде списка, но во всех строках отображаются только данные первой строки. Проверьте мой обновленный вопрос. - person Himanshu Verma; 18.07.2013
comment
Я немного смущен тем, что вы изменили, но вам следует переключиться на два метода, которые я упомянул выше. В любом случае я думаю, что проблема, с которой вы столкнулись, заключается в том, что вы не перемещаете индекс курсора. Вы должны вызвать cr.moveToPosition(position) перед тем, как вытащить данные из курсора. Переключите методы newView bindView, чтобы уменьшить потребность в раздувании новых представлений, поскольку вы не проверяете, является ли convertView значением null, и повторно используете его. - person Bobbake4; 18.07.2013
comment
Вы также печатаете индекс столбцов, а не фактические данные, хранящиеся в курсоре. - person Bobbake4; 18.07.2013
comment
Я отредактировал вопрос, но я получаю список без написанного текста, но когда я нажимаю на них, я могу воспроизводить песни. - person Himanshu Verma; 18.07.2013
comment
Иногда мне кажется, что stackoverflow является частью официальной документации Android... - person kouretinho; 23.09.2014
comment
@Override public View newView(Context ctx, Cursor cursor, ViewGroup parent) { return inflater.inflate(layout, parent, false); } работал лучше для меня. - person Joaquin Iurchuk; 12.03.2015
comment
Это хорошая идея, предоставление родителя позволяет ему использовать параметры макета во время инфляции. - person Bobbake4; 12.03.2015
comment
Вы не указали вид макета, как вы можете найти вид по указанным виджетам ids? - person zionpi; 26.06.2015

вам лучше написать эти строки кода в вашей функции customadapter getview. Это работает для меня и будет работать для вас, это просто.

if (convertView == null) {
    music_column_index = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
    myCursor.moveToPosition(position);
    id = myCursor.getString(music_column_index);
    music_column_index = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);
    myCursor.moveToPosition(position);
    id += " Size(KB):" + myCursor.getString(music_column_index);
    Log.d("TAG", "id::" + id);
    tv.setText(id);
} else
    tv = (TextView) convertView;
    return tv;
}
person zek    schedule 22.04.2014
comment
Ммм, я не вижу, насколько чисто это решение - person Joaquin Iurchuk; 12.03.2015