Android两种时间轴实现

两种实现的效果一样(左边嵌套,右边数据平铺)

代码链接https://download.csdn.net/download/hxinfiniti/11141747

实现时间轴的两种方式:

1、嵌套RecyclerView,需要在Adapter布局中再实现一个RecyclerView

2、把解析的数据再进行封装之后实现数据的平铺,只要一个RecyclerView即可实现效果,根据不同的数据类型设置不同的布局实现数据的展示

这两种实现的效果一样,但是第二种数据平铺的实现性能要更好,毕竟第二种是嵌套了RecyclerView,每个item都要创建RecyclerView布局,只是第一种不用对数据再进行封装;数据封装也比较简单,相比之下,第二种实现方式更好

后台json数据格式:

 "code":0,
    "data":[
        {
            "dataList":[
                {
                    "title":"资讯标题1",
                    "id":1550481263035,
                    "releaseDate":"2019-03-18"
                }
            ],
            "dateString":"2019-03-18"
        }
    ]

第一种实现方式:嵌套方式实现

实体类:这是获取的json格式数据

public class TimeLineData {
    private String dataString;
    private List<DataList> dataList;

    public String getDataString() {
        return dataString;
    }

    public void setDataString(String dataString) {
        this.dataString = dataString;
    }

    public List<DataList> getDataList() {
        return dataList;
    }

    public void setDataList(List<DataList> dataList) {
        this.dataList = dataList;
    }

    static class DataList{
        private String title;
        private String id;
        private String releaseDate;

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getReleaseDate() {
            return releaseDate;
        }

        public void setReleaseDate(String releaseDate) {
            this.releaseDate = releaseDate;
        }

        @Override
        public String toString() {
            return "DataList{" +
                    "title='" + title + '\'' +
                    ", id='" + id + '\'' +
                    ", releaseDate='" + releaseDate + '\'' +
                    '}';
        }
    }

    @Override
    public String toString() {
        return "TimeLineData{" +
                "dataString='" + dataString + '\'' +
                ", dataList=" + dataList +
                '}';
    }
}

适配器

public class TimeLineAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private NewsDetailListener newsDetailListener;

    public void setNewsDetailListener(NewsDetailListener newsDetailListener) {
        this.newsDetailListener = newsDetailListener;
    }

     private List<TimeLineData> timeLineDataList;
     private Context context;

    public void setTimeLineDataList(List<TimeLineData> timeLineDataList) {
        this.timeLineDataList = timeLineDataList;
    }

    public TimeLineAdapter(Context context){
        this.context=context;
    }


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       return new  TimeLineViewHolder(LayoutInflater.from(context).inflate(R.layout.item_time_line,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (!timeLineDataList.isEmpty()){
            TimeLineData timeLineData=timeLineDataList.get(position);
            if (holder instanceof TimeLineViewHolder){
                ((TimeLineViewHolder) holder).mTime.setText(timeLineData.getDataString());
                ((TimeLineViewHolder) holder).mNewsNumber.setText(String.valueOf(timeLineData.getDataList().size()));
                RecyclerView newsRecyclerView=((TimeLineViewHolder) holder).mNewsList;
                LinearLayoutManager manager=new LinearLayoutManager(context);
                manager.setOrientation(LinearLayoutManager.VERTICAL);
                newsRecyclerView.setLayoutManager(manager);
                NewsAdapter newsAdapter=new NewsAdapter(timeLineData.getDataList());
                newsRecyclerView.setAdapter(newsAdapter);
            }
        }
    }

    @Override
    public int getItemCount() {
        return timeLineDataList!=null?timeLineDataList.size():0;
    }


    class TimeLineViewHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.time)
        TextView mTime;
        @BindView(R.id.news_number)
        TextView mNewsNumber;
        @BindView(R.id.news_list)
        RecyclerView mNewsList;
        TimeLineViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }

    // 嵌套的适配器
    class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsItemViewHolder>{

        List<TimeLineData.DataList>  dataLists;

        NewsAdapter(List<TimeLineData.DataList> dataLists){
            this.dataLists=dataLists;
        }

        @NonNull
        @Override
        public NewsItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new NewsItemViewHolder(LayoutInflater.from(context).inflate(R.layout.item_news_title,
                    parent,false));
        }

        @Override
        public void onBindViewHolder(@NonNull NewsItemViewHolder holder, int position) {
            if (!dataLists.isEmpty()){
                TimeLineData.DataList data=dataLists.get(position);
                holder.mNewsTitle.setText(data.getTitle());
            }
        }

        @Override
        public int getItemCount() {
            return dataLists!=null?dataLists.size():0;
        }
        
        class NewsItemViewHolder extends RecyclerView.ViewHolder{
            @BindView(R.id.news_title)
            TextView mNewsTitle;
            NewsItemViewHolder(View itemView) {
                super(itemView);
                ButterKnife.bind(this,itemView);
            }

            @OnClick(R.id.news_detail)
            public void OnClick(){
                if (newsDetailListener!=null){
                    newsDetailListener.detailClick(dataLists.get(getAdapterPosition()));
                }
            }
        }
    }

    /**
     * 点击事件回调
     */
    public interface NewsDetailListener{
         void detailClick(TimeLineData.DataList data);
    }

}

activity实现代码

public class TimeLineActivity extends AppCompatActivity  {
    @BindView(R.id.time_line)
    RecyclerView recyclerView;
    private TimeLineAdapter timeLineAdapter;
    private TimeLineAdapter1 timeLineAdapter1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_line);
        ButterKnife.bind(this);
        initView();
        initData();

      /*  initView1();
        initData1();*/
    }

    private void initView(){
        LinearLayoutManager manager=new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(manager);
        timeLineAdapter = new TimeLineAdapter(this);
        recyclerView.setAdapter(timeLineAdapter);
        // 点击事件监听
        timeLineAdapter.setNewsDetailListener(data -> {
            Toast.makeText(this, data.toString(), Toast.LENGTH_SHORT).show();
        });
    }

    /**
     * 模拟数据
     */
    private void initData(){
        List<TimeLineData> timeLineData=new ArrayList<>();

        TimeLineData timeLineData1=new TimeLineData();
        timeLineData1.setDataString("2019-04-24");
        List<TimeLineData.DataList> dataLists1=new ArrayList<>();
        TimeLineData.DataList data1=new TimeLineData.DataList();
        data1.setId("111111111111111");
        data1.setTitle("资讯标题1");
        data1.setReleaseDate("2019-04-24");
        TimeLineData.DataList data2=new TimeLineData.DataList();
        data2.setId("22222222222");
        data2.setTitle("资讯标题2");
        data2.setReleaseDate("2019-04-24");
        dataLists1.add(data1);
        dataLists1.add(data2);
        timeLineData1.setDataList(dataLists1);
        timeLineData.add(timeLineData1);

        TimeLineData timeLineData2=new TimeLineData();
        timeLineData2.setDataString("2019-04-25");
        List<TimeLineData.DataList> dataLists2=new ArrayList<>();
        TimeLineData.DataList data3=new TimeLineData.DataList();
        data3.setId("33333333");
        data3.setTitle("资讯标题3");
        data3.setReleaseDate("2019-04-24");
        TimeLineData.DataList data4=new TimeLineData.DataList();
        data4.setId("444444444");
        data4.setTitle("资讯标题4");
        data4.setReleaseDate("2019-04-24");
        TimeLineData.DataList data5=new TimeLineData.DataList();
        data5.setId("55555555");
        data5.setTitle("资讯标题5");
        data5.setReleaseDate("2019-04-24");
        dataLists2.add(data3);
        dataLists2.add(data4);
        dataLists2.add(data5);
        timeLineData2.setDataList(dataLists2);
        timeLineData.add(timeLineData2);

        TimeLineData timeLineData3=new TimeLineData();
        timeLineData3.setDataString("2019-04-26");
        List<TimeLineData.DataList> dataLists3=new ArrayList<>();
        TimeLineData.DataList data6=new TimeLineData.DataList();
        data6.setId("33333333");
        data6.setTitle("资讯标题6");
        data6.setReleaseDate("2019-04-24");
        TimeLineData.DataList data7=new TimeLineData.DataList();
        data7.setId("444444444");
        data7.setTitle("资讯标题7");
        data7.setReleaseDate("2019-04-24");
        TimeLineData.DataList data8=new TimeLineData.DataList();
        data8.setId("55555555");
        data8.setTitle("资讯标题8");
        data8.setReleaseDate("2019-04-24");
        dataLists3.add(data6);
        dataLists3.add(data7);
        dataLists3.add(data8);
        timeLineData3.setDataList(dataLists3);
        timeLineData.add(timeLineData3);


        timeLineAdapter.setTimeLineDataList(timeLineData);
        timeLineAdapter.notifyDataSetChanged();

    }


}

第二种实现,需要把后台解析的数据实现再次封装

实体类:需要对解析的数据进行封装成TimeLineData1

public class TimeLineData1 {

    private String title;
    private String id;
    private String releaseDate;
    private String dateString; // 时间,也就是时间轴
    private int type; // 类型,根据不同的类型是时间还是资讯标题
    private int count; // 数量

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getReleaseDate() {
        return releaseDate;
    }

    public void setReleaseDate(String releaseDate) {
        this.releaseDate = releaseDate;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getDateString() {
        return dateString;
    }

    public void setDateString(String dateString) {
        this.dateString = dateString;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "TimeLineData1{" +
                "title='" + title + '\'' +
                ", id='" + id + '\'' +
                ", releaseDate='" + releaseDate + '\'' +
                ", dateString='" + dateString + '\'' +
                ", type=" + type +
                '}';
    }
}

适配器

public class TimeLineAdapter1 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
    enum ItemType{
        TIME, //时间
        NEWS // 标题
    }

    private Context context;
    private List<TimeLineData1> timeLineData1List;
    private OnDetailNewsListener onDetailNewsListener;

    public void setTimeLineData1List(List<TimeLineData1> timeLineData1List) {
        this.timeLineData1List = timeLineData1List;
    }

    public void setOnDetailNewsListener(OnDetailNewsListener onDetailNewsListener) {
        this.onDetailNewsListener = onDetailNewsListener;
    }

    public TimeLineAdapter1(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType==ItemType.TIME.ordinal()){
            return new TimeLineViewHolder(LayoutInflater.from(context).
                    inflate(R.layout.item_time_line1,parent,false));
        }else if (viewType==ItemType.NEWS.ordinal()){
            return new NewsViewHolder(LayoutInflater.from(context).
                    inflate(R.layout.item_news_title,parent,false));
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (!timeLineData1List.isEmpty()){
            TimeLineData1 timeLineData1=timeLineData1List.get(position);
            if (holder instanceof TimeLineViewHolder){
                ((TimeLineViewHolder) holder).mTime.setText(timeLineData1.getDateString());
                ((TimeLineViewHolder) holder).mNewsNumber.setText(String.valueOf(timeLineData1.getCount()));
            }else if (holder instanceof NewsViewHolder){
                ((NewsViewHolder) holder).mNewsTitle.setText(timeLineData1.getTitle());
            }
        }
    }

    @Override
    public int getItemCount() {
        return timeLineData1List!=null?timeLineData1List.size():0;
    }

    @Override
    public int getItemViewType(int position) {
        if (!timeLineData1List.isEmpty()){
            // 根据不同的类型来设置不同布局
            return timeLineData1List.get(position).getType()==0?ItemType.TIME.ordinal():ItemType.NEWS.ordinal();
        }
        return super.getItemViewType(position);
    }


    class TimeLineViewHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.time)
        TextView mTime;
        @BindView(R.id.news_number)
        TextView mNewsNumber;
        TimeLineViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }

    class NewsViewHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.news_title)
        TextView mNewsTitle;

        NewsViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }

        @OnClick(R.id.news_detail)
        public void onClick(){
            if (onDetailNewsListener!=null){
                onDetailNewsListener.onDetailNews(timeLineData1List.get(getAdapterPosition()));
            }
        }
    }

    public interface OnDetailNewsListener{
        void onDetailNews(TimeLineData1 data1);
    }

}

activity中的实现

public class TimeLineActivity extends AppCompatActivity  {
    @BindView(R.id.time_line)
    RecyclerView recyclerView;
    private TimeLineAdapter timeLineAdapter;
    private TimeLineAdapter1 timeLineAdapter1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_line);
        ButterKnife.bind(this);
      /*  initView();
        initData();*/

        initView1();
        initData1();
    }

    private void initView1(){
        LinearLayoutManager manager=new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(manager);
        timeLineAdapter1=new TimeLineAdapter1(this);
        recyclerView.setAdapter(timeLineAdapter1);
        timeLineAdapter1.setOnDetailNewsListener(data1 -> {
            Toast.makeText(this, data1.toString(), Toast.LENGTH_SHORT).show();
        });
    }

    /**
     * 这里直接模拟数据,需要自己实现数据的封装
     */
    private void initData1(){
        List<TimeLineData1> lineData1s=new ArrayList<>();
        TimeLineData1 timeLineData1=new TimeLineData1();
        timeLineData1.setDateString("2019.04.24");
        timeLineData1.setType(0);
        timeLineData1.setCount(2);
        TimeLineData1 timeLineData12=new TimeLineData1();
        timeLineData12.setId("11111111");
        timeLineData12.setReleaseDate("2019.04.24");
        timeLineData12.setTitle("资讯标题1");
        timeLineData12.setDateString("2019.04.24");
        timeLineData12.setType(1);
        TimeLineData1 timeLineData13=new TimeLineData1();
        timeLineData13.setId("2222222222");
        timeLineData13.setReleaseDate("2019.04.24");
        timeLineData13.setTitle("资讯标题2");
        timeLineData13.setDateString("2019.04.24");
        timeLineData13.setType(1);

        TimeLineData1 timeLineData14=new TimeLineData1();
        timeLineData14.setDateString("2019.04.25");
        timeLineData14.setType(0);
        timeLineData14.setCount(1);
        TimeLineData1 timeLineData15=new TimeLineData1();
        timeLineData15.setId("33333333");
        timeLineData15.setReleaseDate("2019.04.25");
        timeLineData15.setTitle("资讯标题3");
        timeLineData15.setDateString("2019.04.25");
        timeLineData15.setType(1);

        TimeLineData1 timeLineData16=new TimeLineData1();
        timeLineData16.setDateString("2019.04.26");
        timeLineData16.setType(0);
        timeLineData16.setCount(1);
        TimeLineData1 timeLineData17=new TimeLineData1();
        timeLineData17.setId("444444444");
        timeLineData17.setReleaseDate("2019.04.26");
        timeLineData17.setTitle("资讯标题4");
        timeLineData17.setDateString("2019.04.26");
        timeLineData17.setType(1);

        lineData1s.add(timeLineData1);
        lineData1s.add(timeLineData12);
        lineData1s.add(timeLineData13);
        lineData1s.add(timeLineData14);
        lineData1s.add(timeLineData15);
        lineData1s.add(timeLineData16);
        lineData1s.add(timeLineData17);

        timeLineAdapter1.setTimeLineData1List(lineData1s);
        timeLineAdapter1.notifyDataSetChanged();
    }


}

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值