Android 在CursorAdapter中重写getView()?

Android 在CursorAdapter中重写getView()?,android,android-listview,garbage-collection,android-cursoradapter,Android,Android Listview,Garbage Collection,Android Cursoradapter,我只是想知道,我们可以在扩展CursorAdapter类的类中重写getView方法吗?CursorAdapter类中未实现的方法是newView以膨胀视图,bindView以将数据源中的数据绑定到视图。但问题是我们无法将视图保存在newView方法中,因此无法将其保存与getView相比,运行垃圾收集的频率更高,在getView中,我们可以更早地获得视图创建的上一个实例。因此,我们可以在扩展CursorAdapter的类中重写getView而不是newView吗?如果可以,我们是否需要每次自己

我只是想知道,我们可以在扩展CursorAdapter类的类中重写getView方法吗?CursorAdapter类中未实现的方法是newView以膨胀视图,bindView以将数据源中的数据绑定到视图。但问题是我们无法将视图保存在newView方法中,因此无法将其保存与getView相比,运行垃圾收集的频率更高,在getView中,我们可以更早地获得视图创建的上一个实例。因此,我们可以在扩展CursorAdapter的类中重写getView而不是newView吗?如果可以,我们是否需要每次自己调用它,或者编译器会为我们调用它? 添加了代码 我正在尝试制作一个音乐播放器,我制作了一个类来处理适配器。我指定了每个类的类型,并制作了这个自定义适配器类的一个对象来处理视图膨胀和数据绑定

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

}当然可以。你可以覆盖它。以下是方法:

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

}
话虽如此,你不需要也不需要。getView调用newView和bindView。所以覆盖getView基本上不会改变什么

您只需自己创建视图并绑定数据,而不用为使用ConvertView而头疼

所有缓存都是在后台完成的,也就是说,如果您没有重写getView方法的话


您可以很容易地找到大多数android类的源代码。以下是

如果您使用多个视图类型,则应覆盖BaseAdapter中的以下内容以获得正确的行为:

公共int getViewTypeCount public int getItemViewType int位置
使用bindview。视图回收已为您处理。bindview参数是一个膨胀的或循环使用的视图,您始终可以使用它。没有理由认为getview会更有效。发布你的代码。非常感谢。事实上,我用logcat运行了代码,它显示了我上下滚动时创建的每个新视图,这大大降低了我列表的性能……因此它不是高效的垃圾收集……我们需要从getView和newView返回视图……所以我只想问我们应该使用哪一个使用…,还是我们需要从这两个位置返回视图?@L_Lawlie请再次尝试logcat+scroll方法,并确保getView未被覆盖。我想看看它的输出。@L_Lawliet好的,我看到你现在已经发布了你的代码。您有多个项目布局,因此多次调用newView是很正常的,即使在滚动时也是如此。@L\u Lawliet如果未覆盖getView,您可以确保它缓存视图。问题似乎不在于调用方法的方式,而在于项目布局本身。可能太多了,或者太复杂了,android系统无法快速呈现。它们只是基本布局,每个都只包含两个TextView和一个小ImageView…..所以我应该为每个适配器创建单独的类吗?或者还有其他解决方案吗?我想过使用它,但我不知道如何使用asynctask loader类和基本适配器,这就是为什么我想到使用带有游标适配器的loadermanager接口的原因,我从google dev站点上的一个示例中学到了这一点我也有点渴望。看看你的代码,我不认为你同时混合了多种类型的视图,但可能只是将类型设置为“public void setTypeint type”,然后执行您的诅咒我正是这么做的…..我在同一时间只启动一种类型的视图…..我在不同的类中创建该类的对象,并传递一个预定义的类型,我已经在这些类中设置了该类型,并将它们与我在这个类中设置的类型