两种实现的效果一样(左边嵌套,右边数据平铺)
代码链接https://download.youkuaiyun.com/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();
}
}