首页 > 解决方案 > Convert string array data to arraylist before using it in recycleview adapter

问题描述

I have an api the structure of it like this:

{"seasons":[
{
"id":"1",
"titles":"s1episode1;s1episode2;s1episode3"
},
{
"id":"2",
"titles":"s2episode1;s2episode2;s2episode3;s2episode4;s2episode5"
}
]}

and so on

and I want data displayed in recycleview app like this:

s1episode1
s1episode2
s1episode3
s2episode1
s2episode2
s2episode3
s2episode4
s2episode5

so each line represent an item of recycleview

I parse the data and in model class use parcelable:

public class Series implements Parcelable {

    private int id;
    private String titles;

    public Series(int id, String titles) {
        this.id = id;
        this.titles = titles;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(id);
        out.writeString(titles);
    }

    private Series(Parcel in) {
        this.id         = in.readInt();
        this.titles         = in.readString();
    }

    public Series() {
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<Series> CREATOR = new Creator<Series>() {
        @Override
        public Series createFromParcel(Parcel in) {
            return new Series(in);
        }
        @Override
        public Series[] newArray(int i) {
            return new Series[i];
        }
    };

    public int getId() {
        return id;
    }

    public String getTitles() {
        return titles;
    }

        public List<String> getEpisodes(){
            String[] titles = getTitles().split(";");

            List<String> titleList = Arrays.asList(titles);

            String titlesArray = null;
            for (String e : titleList) {
                titlesArray += String.valueOf(e);
            }

            return titleList;
        }

}

you can see in getEpisodes() I tried to treat the data by convert it from string array to arraylist to prepare it before use it in recycleview

and I create a new collection for RecyclerViewAdapter:

class Episode {
    int id;
    String title;

    public Episode(int id, String title) {
        this.id = id;
        this.title = title;
    }

    public static List<Episode> createEpisodeList(int id, List<String> titles) {
        List<Episode> episodes = new ArrayList(titles.size());
        for (String title : titles) {
            episodes.add(new Episode(id, title));
        }
        return episodes;
    }
}

and this is the code of recycleview adapter:

    public class SeriesAdapter extends RecyclerView.Adapter<SeriesAdapter.RecyclerViewHolder> {

        ArrayList<Series> mSeries;
        List<Episode> episodesList = new ArrayList();

        private Context context;
        private SeriesAdapterOnClickHandler mClickHandler;

public interface SeriesAdapterOnClickHandler {
    void onClick(Series series);
}

    public SeriesAdapter(SeriesAdapterOnClickHandler clickHandler) {
        mClickHandler = clickHandler;
    }

    public void setClickListener(SeriesAdapterOnClickHandler callback) {
        mClickHandler = callback;
    }

class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public final TextView title;

    public RecyclerViewHolder(View view) {
        super(view);
        title = (TextView)itemView.findViewById(R.id.title);
        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int adapterPosition = getAdapterPosition();
        Series series = mSeries.get(adapterPosition);
        mClickHandler.onClick(series);
    }

}

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        context = viewGroup.getContext();
        int layoutIdForListItem = R.layout.series_list_item;
        LayoutInflater inflater = LayoutInflater.from(context);
        boolean shouldAttachToParentImmediately = false;

        View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);

        RecyclerViewHolder holder = new RecyclerViewHolder(view);

        return new RecyclerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecyclerViewHolder holder, final int position) {
        holder.title.setText(String.valueOf(mSeries.get(position).getEpisodes()));

    }

    @Override
    public int getItemCount() {
        if (null == mSeries)
            return 0;
        else {
            return mSeries.size();
        }
    }

    @Override
    public int getItemViewType(int position) {
        if (null == mSeries)
            return 0;
        else {
            return mSeries.size();
        }
    }

    public void setSeriesData(ArrayList<Series> seriesData) {
        for (Series s : seriesData) {
            episodesList.addAll(Episode.createEpisodeList(s.getEpisodes()));
        }
//        mSeries = seriesData;
        notifyDataSetChanged();
    }
}

but in app the data displayed nothing

so how should I treat the data by convert it from string array to arraylist to prepare it to be used in recycleview and display each episode as single recycle item

like this:

    s1episode1
    s1episode2
    s1episode3
    s2episode1
    s2episode2
    s2episode3
    s2episode4
    s2episode5

标签: javaandroid

解决方案


Create new collection for RecyclerViewAdapter:

class Episode {
    int id;
    String title;

    public Episode(int id, String title) {
        this.id = id;
        this.title = title;
    }

    public static List<Episode> createEpisodeList(int id, List<String> titles) {
        List<Episode> episodes = new ArrayList(titles.size());
        for (String title : titles) {
            episodes.add(new Episode(id, title));
        }
        return episodes;
    }
}

and in adapter convert series list to new collection:

List<Episode> episodesList = new ArrayList();

void setSeries(List<Series> series) {
    for (Series s : series) {
        episodesList.addAll(Episode.createEpisodeList(s.id, s.getEpisododes()));
    }
    notifyDataSetChanged();
}

Edited adapter code:

public class EpisodeAdapter extends RecyclerView.Adapter<EpisodeAdapter.RecyclerViewHolder> {

    private static final int TYPE_EPISODE = 0; // it's possible to show multiple types recycler

    List<Episode> episodesList = new ArrayList();

    private Context context;
    private AdapterOnClickHandler mClickHandler;

    public interface AdapterOnClickHandler {
        void onClick(Episode episode);
    }

    public EpisodeAdapter(AdapterOnClickHandler clickHandler) {
        mClickHandler = clickHandler;
    }

    public void setClickListener(AdapterOnClickHandler callback) {
        mClickHandler = callback;
    }

    class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public final TextView title;

        public RecyclerViewHolder(View view) {
            super(view);
            title = (TextView)itemView.findViewById(R.id.title);
            view.setOnClickListener(this);
        }

        public void setData(Episode episode) {
            title.setText(episode.title);
        }

        @Override
        public void onClick(View v) {
            int adapterPosition = getAdapterPosition();
            Episode episode = episodesList.get(adapterPosition);
            mClickHandler.onClick(episode);
        }

    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        context = viewGroup.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.series_list_item, viewGroup, false);
        return new RecyclerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecyclerViewHolder holder, final int position) {
       holder.setData(episodesList.get(position));
    }

    @Override
    public int getItemCount() {
        return episodesList.size();
    }

    @Override
    public int getItemViewType(int position) {
        return TYPE_EPISODE;
    }

    public void setSeriesData(ArrayList<Series> seriesData) {
        episodesList.clear();
        for (Series s : seriesData) {
            episodesList.addAll(Episode.createEpisodeList(s.getEpisodes()));
        }
        notifyDataSetChanged();
    }
}

推荐阅读