Изменить код адаптера ListView на RecyclerView

552
06 февраля 2017, 15:41

Добрый день. Написал приложение в котором есть ListView и написал для нее адаптер. но сейчас нужно изменить и поставить RecyclerView. Для RecyclerView попробовал изменять код адаптера но не получилось. Помогите пожалуйста.

   public class SongAdapter extends BaseAdapter {
    //song list and layout
    private ArrayList<Song> songs;
    private LayoutInflater songInf;
    //constructor
    public SongAdapter(Context c, ArrayList<Song> theSongs){
        songs=theSongs;
        songInf=LayoutInflater.from(c);
    }
    @Override
    public int getCount() {
        return songs.size();
    }
    @Override
    public Object getItem(int arg0) {
        return null;
    }
    @Override
    public long getItemId(int arg0) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //map to song layout
        LinearLayout songLay = (LinearLayout)songInf.inflate
                (R.layout.song, parent, false);
        //get title and artist views
        TextView songView = (TextView)songLay.findViewById(R.id.song_title);
        TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
        //get song using position
        Song currSong = songs.get(position);
        //get title and artist strings
        songView.setText(currSong.getTitle());
        artistView.setText(currSong.getArtist());
        //set position as tag
        songLay.setTag(position);
        return songLay;
    }
}

а вот код который я попробовал изменить.

 public class MPAdapter extends RecyclerView.Adapter<MPAdapter.RecyclerViewHolder> {
    private ArrayList<Song> songs;
    LayoutInflater layoutInflater;
    RecyclerView.ViewHolder viewHolder;
    public MPAdapter(Context context,ArrayList<Song> songs)
    {
        this.songs=songs;
    }
    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LinearLayout linearLayout=(LinearLayout)layoutInflater.inflate(R.layout.single_song,parent,false);
        RecyclerViewHolder viewHolder=new RecyclerViewHolder(linearLayout,context,songs);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        Song song=songs.get(position);
        holder.titleText.setText(song.getTitle());
        holder.arstistText.setText(song.getArtist());
    }
    @Override
    public int getItemCount() {
        return songs.size();
    }

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder
    {
        TextView titleText;
        TextView arstistText;
        Context context;
        ArrayList<Song> songs=new ArrayList<>();
        public RecyclerViewHolder(View itemView, Context context, final ArrayList<Song> songs)
        {
            super(itemView);
            this.context=context;
            this.songs=songs;
            titleText=(TextView)itemView.findViewById(R.id.song_title);
            arstistText=(TextView)itemView.findViewById(R.id.song_artist);
        }
    }
}
Answer 1

Не путайте конструктор холдера с конструктором адаптера. В onCreateViewHolder вы тоже нахимичили, гляньте, должно работать

public class MPAdapter extends RecyclerView.Adapter<MPAdapter.RecyclerViewHolder> {
    List<Song> songs;
    LayoutInflater layoutInflater;
    Context context;
    public MPAdapter(Context context, List<Song> songs)
    {
        this.songs=songs;
        this.context=context;
    }
    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_song, parent, false);
        RecyclerViewHolder viewHolder=new RecyclerViewHolder(v);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        Song song = getItem(position);
        holder.titleText.setText(song.getTitle());
        holder.arstistText.setText(song.getArtist());
    }
    @Override
    public int getItemCount() {
        return songs.size();
    }
    public Song getItem(int position) {
        return songs.get(position);
    }
    public class RecyclerViewHolder extends RecyclerView.ViewHolder
    {
        TextView titleText;
        TextView arstistText;
        public RecyclerViewHolder(View itemView)
        {
            super(itemView);
            titleText=(TextView)itemView.findViewById(R.id.song_title);
            arstistText=(TextView)itemView.findViewById(R.id.song_artist);
        }
    }
}
READ ALSO
Отображение изображения в html теге

Отображение изображения в html теге

Допустим есть некий код :

445
Не отображается Full image

Не отображается Full image

Делаю приложение с обоями, НО возникла проблема с отображением картинки, картинка появляется только после того как я нажимаю на кнопку "Установить...

476
Как сохранить состояние у listView?

Как сохранить состояние у listView?

Есть 3 таба для навигации, в каждом табе фрагмент, во фрагменте listview

536