0

Я просто хотел бы знать, что мы можем переопределить метод getView() в классе, который расширяет CursorAdapter класса? Невыполненные методы в CursorAdapter классе newView() надуть View и bindView() связать данные из источника данных в View. Но проблема в том, что мы не можем сохранить View внутри метода newView() и, следовательно, он работает garbage collection чаще по сравнению с getView() где мы получаем предыдущий экземпляр View создать earlier.So мы можем переопределить getView() вместо newView() в классе, который простирается CursorAdapter? И если мы можем, нам нужно каждый раз называть это самим или компилятор сделает это за нас? Код добавлен Я пытаюсь создать музыкальный проигрыватель, и я сделал один класс для обработки адаптера. Я указал тип каждого класса и создал объект этого класса адаптеров для обработки инфляции и привязки данных ,Переопределение getView() в CursorAdapter?

public class PopulatingListAdapter extends CursorAdapter { 

private final static int ALL_SONGS_TYPE = 0; 
private final static int ALBUM_SONGS = 1; 
private final static int ARTIST_SONGS = 2; 
private final static int ALBUM_TYPE = 3; 
private final static int ARTIST_TYPE = 4; 

private final LayoutInflater myInflater; 

private int typeOfList; 

public void setType(int type){ 
    typeOfList=type; 
} 

public PopulatingListAdapter(Context context, Cursor c, int flags) { 
    super(context, c, flags); 
    // TODO Auto-generated constructor stub 
    myInflater = LayoutInflater.from(context); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    // TODO Auto-generated method stub 

    if(typeOfList==ALL_SONGS_TYPE) 
    { 
     TextView songTitleNameAllSongs = (TextView) view.findViewById(R.id.all_song_title); 
     songTitleNameAllSongs.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))); 

     TextView songDisplayNameAllSongs = (TextView) view.findViewById(R.id.all_song_display); 
     songDisplayNameAllSongs.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME))); 

     ImageView albumArtInAllSongs = (ImageView) view.findViewById(R.id.album_art_all_songs_single_row); 

    }else if(typeOfList==ALBUM_TYPE) 
    { 
     TextView albumCoverTitleInAllAlbums = (TextView) view.findViewById(R.id.album_cover_title); 
     albumCoverTitleInAllAlbums.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM))); 

     TextView artistAlbumTitleInAllAlbums = (TextView) view.findViewById(R.id.artist_album_title); 
     artistAlbumTitleInAllAlbums.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST))); 

     ImageView albumArtInAllAlbum = (ImageView) view.findViewById(R.id.album_single_row_album_art); 
     Bitmap bmp = BitmapFactory.decodeFile(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART))); 
     if(bmp!=null) 
      albumArtInAllAlbum.setImageBitmap(bmp); 
     else 
      albumArtInAllAlbum.setImageDrawable(context.getResources().getDrawable(R.drawable.head_10));   
    }else if(typeOfList==ARTIST_TYPE) 
    { 
     TextView artistNameInAllArtist = (TextView) view.findViewById(R.id.artists_single_name); 
     artistNameInAllArtist.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Artists.ARTIST))); 

    }else if(typeOfList==ALBUM_SONGS) 
    { 
     TextView albumSongTitleNameInAlbumSongs = (TextView) view.findViewById(R.id.albums_songs_name_of_song); 
     albumSongTitleNameInAlbumSongs.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))); 

     TextView albumSongDisplayNameInAlbumSongs = (TextView) view.findViewById(R.id.albums_songs_name_of_album); 
     albumSongDisplayNameInAlbumSongs.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM))); 
    }else if(typeOfList==ARTIST_SONGS){ 
     TextView artistSongTitleNameInArtistSongs = (TextView) view.findViewById(R.id.artist_song_title_name); 
     artistSongTitleNameInArtistSongs.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))); 

     TextView artistSongDisplayNameInArtistSongs = (TextView) view.findViewById(R.id.artist_song_artist_name); 
     artistSongDisplayNameInArtistSongs.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))); 
    } 
    } 


/*@Override 
public View getView(int arg0, View arg1, ViewGroup arg2) { 
    // TODO Auto-generated method stub 
    return super.getView(arg0, arg1, arg2); 
}*/ 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View myView=null; 
     if(typeOfList==ALL_SONGS_TYPE) 
     { 
      myView = myInflater.inflate(R.layout.all_songs_single_row, parent, false); 
     }else if(typeOfList==ALBUM_TYPE) 
     { 
      myView = myInflater.inflate(R.layout.album_single_row, parent, false); 
     }else if(typeOfList==ARTIST_TYPE) 
     { 
      myView = myInflater.inflate(R.layout.artists_single_row, parent, false); 
     }else if(typeOfList==ALBUM_SONGS) 
     { 
      myView = myInflater.inflate(R.layout.albums_songs_single_row, parent, false); 
     }else if(typeOfList==ARTIST_SONGS) 
     { 
      myView = myInflater.inflate(R.layout.artists_song_single_row, parent, false); 
     } 
    return myView; 
} 

}

+0

использование переписка. утилита просмотра уже обрабатывается для вас. Параметр bindview представляет собой завышенный или переработанный вид, который всегда действителен для вас. – njzk2

+0

нет никакой причины, почему getview будет более эффективным. разместите свой код. – njzk2

ответ

0

Конечно. Вы можете переопределить его. Вот как:

public class CustomAdapter extends CursorAdapter { 

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

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return super.getView(position, convertView, parent); 
    } 

} 

Это сказанное, у вас нет (не нужно), чтобы. newView и bindView вызывается getView. Поэтому переопределение getView в основном ничего не изменит.

Вы просто создаете представления самостоятельно и привязываете данные, не имея головной боли при работе с convertViews.

Все кэширование выполняется в фоновом режиме, то есть если вы не переопределили метод getView.

Вы можете легко найти исходный код для большинства классов Android. Вот CursorAdapter's getView method implementation.

+0

Спасибо большое. Фактически я запускал код с помощью logcat, и он показывал каждый новый вид, создаваемый при прокрутке вверх или вниз, и это значительно уменьшало производительность моего списка ... Таким образом, это была не эффективная сборка мусора. .... И нам нужно возвращать представления как из getView(), так и из newView() ... Поэтому я просто хочу спросить, с чем мы должны работать ... или нам нужно возвращать представления из обоих? –

+0

@L_Lawliet снова попробуйте метод logcat + scroll и убедитесь, что getView не переопределен. Я бы хотел увидеть результат этого. – Simas

+0

Подожди минут .... позвольте мне опубликовать его .... –

0

Если вы используете несколько типов представлений, необходимо переопределить следующие из BaseAdapter, чтобы получить правильное поведение:

  • общественного ИНТ getViewTypeCount()
  • общественности INT getItemViewType (целое положение)
+0

Я думал об использовании этого, но я не знаю, как работать с классом загрузчика asynctask с базовым адаптером, поэтому подумал об использовании интерфейса loadermanager с помощью курсора, который я узнал из примера на веб-сайте google. –

+0

Я был немного к нетерпеливому также. Глядя на ваш код, я не думаю, что вы смешиваете несколько типов представлений одновременно, но, вероятно, просто установите тип с помощью «public void setType (int type)», а затем выполните свой курсор –

+0

да, я делаю это точно ..... Я запускаю только один тип представления за один раз ..... –

Смежные вопросы