android 实现仿本日头条推荐列表界面

打印 上一主题 下一主题

主题 783|帖子 783|积分 2349

1.创建程序

(1)创建一个比方叫HeadLine的应用程序,一共必要3个java文件和4个xml结构文件如图:

2. 添加recyclerview-v7库

不知道怎么添加可以看这个博主文章 http://t.csdnimg.cn/cWKnz
3.创建样式

我们可以看出仿本日头条推荐列表界面顶部一行文字样式一样,可以单独放在tvStyle中,每个条目下面底部灰色文字的样式也一样,单独放到tvInfo中,推荐列表界面显示的3张图片样式一样,所以也可单独放在ivImg中这三个都是在res/values/styles.xml中设置,代码如下:
  1. <resources>
  2.     <style name="tvStyle">
  3.         <item name="android:layout_width">wrap_content</item>
  4.         <item name="android:layout_height">match_parent</item>
  5.         <item name="android:padding">10dp</item>
  6.         <item name="android:gravity">center</item>
  7.         <item name="android:textSize">15sp</item>
  8.     </style>
  9.     <style name="tvInfo">
  10.         <item name="android:layout_width">wrap_content</item>
  11.         <item name="android:layout_height">wrap_content</item>
  12.         <item name="android:layout_marginLeft">8dp</item>
  13.         <item name="android:gravity">center_vertical</item>
  14.         <item name="android:textSize">14sp</item>
  15.         <item name="android:textColor">@color/gray_color</item>
  16.     </style>
  17.     <style name="ivImg">
  18.         <item name="android:layout_width">0dp</item>
  19.         <item name="android:layout_height">90dp</item>
  20.         <item name="android:layout_weight">1</item>
  21.         <!--ll_info为布局文件list_item_one.xml中的id-->
  22.         <item name="android:layout_toRightOf">@+id/ll_info</item>
  23.     </style>
复制代码
4.设置颜色值

仿本日头条推荐列表界面的配景为浅灰色,底部文字深灰色,在res/values/color.xml中设置
  1. <resources>
  2.     <color name="black">#FF000000</color>
  3.     <color name="white">#FFFFFFFF</color>
  4.     <color name="gray_color">#828282</color>     //深灰
  5.     <color name="light_gray_color">#eeeeee</color>     //浅灰
  6. </resources>
复制代码
5.创建标题栏

顶部有一个带有搜索框的标题栏,避免结构文件在文件代码太多,可单独放title_bar.xml文件中,详细代码如下:
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_height="50dp"
  3.     android:layout_width="match_parent"
  4.     android:background="#d33d3c"
  5.     android:orientation="horizontal"
  6.     android:paddingLeft="10dp"
  7.     android:paddingRight="10dp">
  8.     <TextView
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"
  11.         android:layout_gravity="center"
  12.         android:text="仿今日头条"
  13.         android:textColor="@android:color/white"
  14.         android:textSize="22sp"/>
  15.     <EditText
  16.         android:layout_width="match_parent"
  17.         android:layout_height="35dp"
  18.         android:layout_gravity="center_vertical"
  19.         android:layout_marginStart="15dp"
  20.         android:layout_marginLeft="5dp"
  21.         android:layout_marginRight="15dp"
  22.         android:background="@drawable/search_bg"
  23.         android:gravity="center_vertical"
  24.         android:textColor="@android:color/black"
  25.         android:hint="搜你想搜的"
  26.         android:textColorHint="@color/gray_color"
  27.         android:textSize="14sp"
  28.         android:paddingLeft="30dp"/>
  29. </LinearLayout>
复制代码
6. 搭建列表界面

activity_main.xml文件中设置,其中列表必要RecyclerView来显示,这是recyclerview-v7库中的控件,详细代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:id="@+id/main"
  6.     android:layout_width="match_parent"
  7.     android:layout_height="match_parent"
  8.     tools:context=".MainActivity"
  9.     android:background="@color/light_gray_color"
  10.     android:orientation="vertical">
  11.     //把标题栏放进来
  12.     <include layout="@layout/title_bar" />
  13.     <LinearLayout
  14.         android:layout_width="match_parent"
  15.         android:layout_height="40dp"
  16.         android:background="@android:color/white"
  17.         android:orientation="horizontal">
  18.         <TextView
  19.             style="@style/tvStyle"
  20.             android:text="推荐"
  21.             android:textColor="@android:color/holo_red_dark" />
  22.         <TextView
  23.             style="@style/tvStyle"
  24.             android:text="抗疫"
  25.             android:textColor="@color/gray_color" />
  26.         <TextView
  27.             style="@style/tvStyle"
  28.             android:text="小视频"
  29.             android:textColor="@color/gray_color" />
  30.         <TextView
  31.             style="@style/tvStyle"
  32.             android:text="北京"
  33.             android:textColor="@color/gray_color" />
  34.         <TextView
  35.             style="@style/tvStyle"
  36.             android:text="视频"
  37.             android:textColor="@color/gray_color" />
  38.         <TextView
  39.             style="@style/tvStyle"
  40.             android:text="热点"
  41.             android:textColor="@color/gray_color" />
  42.         <TextView
  43.             style="@style/tvStyle"
  44.             android:text="娱乐"
  45.             android:textColor="@color/gray_color" />
  46.     </LinearLayout>
  47.     <View
  48.         android:layout_width="match_parent"
  49.         android:layout_height="1dp"
  50.         android:background="#eeeeee" />
  51.     <androidx.recyclerview.widget.RecyclerView
  52.         android:id="@+id/rv_list"
  53.         android:layout_width="match_parent"
  54.         android:layout_height="match_parent"/>
  55. </LinearLayout>
复制代码
8. 搭建列表界面的条目界面

界面条目有3种显示情势,第一种是不显示图片,第二种是显示1张,第三种是显示3张,不显示图片和显示1张的情势可以用用雷同条目界面,在list_item_one.xml结构文件中设置,显示3张在list_item_two.xml结构文件中设置
list_item_one.xml详细代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="90dp"
  5.     android:layout_marginBottom="8dp"
  6.     android:background="@android:color/white"
  7.     android:padding="8dp">
  8.     <LinearLayout
  9.         android:id="@+id/ll_info"
  10.         android:layout_width="wrap_content"
  11.         android:layout_height="wrap_content"
  12.         android:orientation="vertical">
  13.         <TextView
  14.             android:id="@+id/tv_title"
  15.             android:layout_width="280dp"
  16.             android:layout_height="wrap_content"
  17.             android:maxLines="2"
  18.             android:textColor="#3c3c3c"
  19.             android:textSize="16sp"/>
  20.         <RelativeLayout
  21.             android:layout_width="match_parent"
  22.             android:layout_height="match_parent">
  23.             <ImageView
  24.                 android:id="@+id/iv_top"
  25.                 android:layout_width="20dp"
  26.                 android:layout_height="20dp"
  27.                 android:layout_alignParentBottom="true"
  28.                 android:src="@drawable/top"/>
  29.             <LinearLayout
  30.                 android:layout_width="match_parent"
  31.                 android:layout_height="wrap_content"
  32.                 android:layout_alignParentBottom="true"
  33.                 android:layout_toRightOf="@+id/iv_top"
  34.                 android:orientation="horizontal">
  35.                 <TextView
  36.                     android:id="@+id/tv_name"
  37.                     style="@style/tvInfo"/>
  38.                 <TextView
  39.                     android:id="@+id/tv_comment"
  40.                     style="@style/tvInfo"/>
  41.                 <TextView
  42.                     android:id="@+id/tv_time"
  43.                     style="@style/tvInfo"/>
  44.             </LinearLayout>
  45.         </RelativeLayout>
  46.     </LinearLayout>
  47.     <ImageView
  48.         android:id="@+id/iv_img"
  49.         android:layout_width="match_parent"
  50.         android:layout_height="90dp"
  51.         android:layout_toRightOf="@+id/ll_info"
  52.         android:padding="3dp"/>
  53. </RelativeLayout>
复制代码
list_item_two.xml详细代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="wrap_content"
  5.     android:layout_marginBottom="8dp"
  6.     android:background="@android:color/white">
  7.     <TextView
  8.         android:id="@+id/tv_title"
  9.         android:layout_width="match_parent"
  10.         android:layout_height="wrap_content"
  11.         android:maxLines="2"
  12.         android:padding="8dp"
  13.         android:textColor="#3c3c3c"
  14.         android:textSize="16sp"/>
  15.     <LinearLayout
  16.         android:id="@+id/ll_img"
  17.         android:layout_width="match_parent"
  18.         android:layout_height="wrap_content"
  19.         android:layout_below="@+id/tv_title"
  20.         android:orientation="horizontal">
  21.         <ImageView
  22.             android:id="@+id/iv_img1"
  23.             style="@style/ivImg"/>
  24.         <ImageView
  25.             android:id="@+id/iv_img2"
  26.             style="@style/ivImg"/>
  27.         <ImageView
  28.             android:id="@+id/iv_img3"
  29.             style="@style/ivImg"/>
  30.     </LinearLayout>
  31.     <LinearLayout
  32.         android:layout_width="wrap_content"
  33.         android:layout_height="wrap_content"
  34.         android:layout_below="@id/ll_img"
  35.         android:orientation="vertical"
  36.         android:padding="8dp">
  37.         <LinearLayout
  38.             android:layout_width="match_parent"
  39.             android:layout_height="wrap_content"
  40.             android:orientation="horizontal">
  41.             <TextView
  42.                 android:id="@+id/tv_name"
  43.                 style="@style/tvInfo"/>
  44.             <TextView
  45.                 android:id="@+id/tv_comment"
  46.                 style="@style/tvInfo"/>
  47.             <TextView
  48.                 android:id="@+id/tv_time"
  49.                 style="@style/tvInfo"/>
  50.         </LinearLayout>
  51.     </LinearLayout>
  52. </RelativeLayout>
复制代码
9.封装消息信息实体类

创建NewsBean来放置消息id,标题,图片,用户名,评论数,发布时间,范例等属性,详细代码如下:
  1. package cn.itcast.headline;
  2. import java.util.List;
  3. public class NewsBean {
  4.     private int id;
  5.     private String title;
  6.     private List<Integer> imList;
  7.     private String name;
  8.     private String comment;
  9.     private String time;
  10.     private int type;
  11.     public int getId(){
  12.         return id;
  13.     }
  14.     public void setId(int id){
  15.         this.id = id;
  16.     }
  17.     public String getTitle(){
  18.         return title;
  19.     }
  20.     public void setTitle(String title){
  21.         this.title = title;
  22.     }
  23.     public String getName(){
  24.         return name;
  25.     }
  26.     public void setName(String name){
  27.         this.name = name;
  28.     }
  29.     public String getComment(){
  30.         return comment;
  31.     }
  32.     public void setComment(String comment){
  33.         this.comment = comment;
  34.     }
  35.     public String getTime(){
  36.         return time;
  37.     }
  38.     public void setTime(String time){
  39.         this.time = time;
  40.     }
  41.     public List<Integer> getImList(){
  42.         return imList;
  43.     }
  44.     public void setImList(List<Integer> imList) {
  45.         this.imList = imList;
  46.     }
  47.     public int getType(){
  48.         return type;
  49.     }
  50.     public void setType(int type){
  51.         this.type = type;
  52.     }
  53. }
复制代码
10.编写列表界面的数据适配器

创建一个继承RecyclerView.Adapter<RecyclerView.ViewHolder>类的NewsAdapter类,该类重写加载条目数onCreateViewHolder(),获取条目范例getItemViewType(),绑定界面数据onBindViewHolder(),获取条目总数getItemCount()的方法,详细代码如下:
  1. package cn.itcast.headline;
  2. import android.content.Context;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.ImageView;
  7. import android.widget.TextView;
  8. import androidx.annotation.NonNull;
  9. import androidx.recyclerview.widget.RecyclerView;
  10. import java.util.List;
  11. public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  12.     private Context mContext;
  13.     private List<NewsBean> NewsList;
  14.     public NewsAdapter(Context context,List<NewsBean> NewsList){
  15.         this.mContext = context;
  16.         this.NewsList = NewsList;
  17.     }
  18.     @NonNull
  19.     @Override
  20.     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  21.         View itemView=null;
  22.         RecyclerView.ViewHolder holder=null;
  23.         if (viewType == 1){
  24.             itemView = LayoutInflater.from(mContext).inflate(R.layout.list_item_one,parent,false);
  25.             holder = new MyViewHolder1(itemView);
  26.         } else if (viewType == 2) {
  27.             itemView = LayoutInflater.from(mContext).inflate(R.layout.list_item_two,parent,false);
  28.             holder = new MyViewHolder2(itemView);
  29.         }
  30.         return holder;
  31.     }
  32.     @Override
  33.     public int getItemViewType(int position) {
  34.         return NewsList.get(position).getType();
  35.     }
  36.     @Override
  37.     public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
  38.         NewsBean bean = NewsList.get(position);
  39.         if (holder instanceof MyViewHolder1) {
  40.             if (position == 0) {
  41.                 ((MyViewHolder1) holder).iv_top.setVisibility(View.VISIBLE);
  42.                 ((MyViewHolder1) holder).iv_img.setVisibility(View.GONE);
  43.             } else {
  44.                 ((MyViewHolder1) holder).iv_top.setVisibility(View.GONE);
  45.                 ((MyViewHolder1) holder).iv_top.setVisibility(View.VISIBLE);
  46.             }
  47.             ((MyViewHolder1) holder).title.setText(bean.getTitle());
  48.             ((MyViewHolder1) holder).name.setText(bean.getName());
  49.             ((MyViewHolder1) holder).comment.setText(bean.getComment());
  50.             ((MyViewHolder1) holder).time.setText(bean.getTime());
  51.             if (bean.getImList().size() == 0) return;
  52.             ((MyViewHolder1) holder).iv_img.setImageResource(bean.getImList().get(0));
  53.         } else if (holder instanceof MyViewHolder2) {
  54.             ((MyViewHolder2) holder).title.setText(bean.getTitle());
  55.             ((MyViewHolder2) holder).name.setText(bean.getName());
  56.             ((MyViewHolder2) holder).comment.setText(bean.getComment());
  57.             ((MyViewHolder2) holder).time.setText(bean.getTime());
  58.             ((MyViewHolder2) holder).iv_img1.setImageResource(bean.getImList().get(0));
  59.             ((MyViewHolder2) holder).iv_img2.setImageResource(bean.getImList().get(1));
  60.             ((MyViewHolder2) holder).iv_img3.setImageResource(bean.getImList().get(2));
  61.         }
  62.     }
  63.     @Override
  64.     public int getItemCount() {
  65.         return NewsList.size();
  66.     }
  67.     class MyViewHolder1 extends RecyclerView.ViewHolder{
  68.         ImageView iv_top,iv_img;
  69.         TextView title,name,comment,time;
  70.         public MyViewHolder1(View view) {
  71.             super(view);
  72.             iv_top = view.findViewById(R.id.iv_top);
  73.             iv_img = view.findViewById(R.id.iv_img);
  74.             title = view.findViewById(R.id.tv_title);
  75.             name = view.findViewById(R.id.tv_name);
  76.             comment = view.findViewById(R.id.tv_comment);
  77.             time = view.findViewById(R.id.tv_time);
  78.         }
  79.     }
  80.     class MyViewHolder2 extends RecyclerView.ViewHolder{
  81.         ImageView iv_img1,iv_img2,iv_img3;
  82.         TextView title,name,comment,time;
  83.         public MyViewHolder2(View view) {
  84.             super(view);
  85.             iv_img1 = view.findViewById(R.id.iv_img1);
  86.             iv_img2 = view.findViewById(R.id.iv_img2);
  87.             iv_img3 = view.findViewById(R.id.iv_img3);
  88.             title = view.findViewById(R.id.tv_title);
  89.             name = view.findViewById(R.id.tv_name);
  90.             comment = view.findViewById(R.id.tv_comment);
  91.             time = view.findViewById(R.id.tv_time);
  92.         }
  93.     }
  94. }
复制代码
11.显示列表的数据

在MainActivity中首先定义6个数组,分别是标题titles,用户名数据names,评论comments,发布时间times,icons1(显示一张图数据),icons2(显示两张图数据),定义的数据添加到NewsList中,并将集合数据设置到NewsAdapter中,详细代码如下:
  1. package cn.itcast.headline;
  2. import android.os.Bundle;
  3. import androidx.activity.EdgeToEdge;
  4. import androidx.appcompat.app.AppCompatActivity;
  5. import androidx.core.graphics.Insets;
  6. import androidx.core.view.ViewCompat;
  7. import androidx.core.view.WindowInsetsCompat;
  8. import androidx.recyclerview.widget.RecyclerView;
  9. import androidx.recyclerview.widget.RecyclerView;
  10. import androidx.recyclerview.widget.LinearLayoutManager;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. public class MainActivity extends AppCompatActivity {
  14.     private String[] titles = {"各地餐企齐行动,杜绝餐饮浪费","花菜有人焯水,有人直接炒,都错了,看饭店大厨如何做",
  15.             "睡觉时,双脚突然蹬一下,有踩空感,像高楼坠落,是咋回事?",
  16.             "实拍外卖小哥砸开小吃店的卷帘门救火,灭火后淡定继续送外卖",
  17.             "还没成熟就被迫提前采摘,8毛一斤却没人要,果农无奈:不摘不行",
  18.             "大会、大展、大赛一起来,北京电竞“好嗨哟”"};
  19.     private String[] names = {"央视新闻客户端","味美食记","民富康健康","生活小记","禾木报告","燕鸣"};
  20.     private String[] comment = {"9884评","18评","78评","678评","189评","304评"};
  21.     private String[] times = {"6小时前","刚刚","1小时前","2小时前","3小时前","4小时前"};
  22.     private int[] icons1 = {R.drawable.food,R.drawable.takeout,R.drawable.e_sports};
  23.     private int[] icons2 = {R.drawable.sleep1, R.drawable.sleep2, R.drawable.sleep3, R.drawable.fruit1, R.drawable.fruit2, R.drawable.fruit3};
  24.     private int[] types = {1,1,2,1,2,1};
  25.     private RecyclerView mRecyclerView;
  26.     private NewsAdapter mAdapter;
  27.     private List<NewsBean> NewsList;
  28.     @Override
  29.     protected void onCreate(Bundle savedInstanceState) {
  30.         super.onCreate(savedInstanceState);
  31.         setContentView(R.layout.activity_main);
  32.         setData();
  33.         mRecyclerView = findViewById(R.id.rv_list);
  34.         mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  35.         mAdapter = new NewsAdapter(MainActivity.this,NewsList);
  36.         mRecyclerView.setAdapter(mAdapter);
  37.     }
  38.     private void setData(){
  39.         NewsList = new ArrayList<NewsBean>();
  40.         NewsBean bean;
  41.         for (int i = 0;i < titles.length;i++){
  42.             bean = new NewsBean();
  43.             bean.setId(i+1);
  44.             bean.setTitle(titles[i]);
  45.             bean.setName(names[i]);
  46.             bean.setComment(comment[i]);
  47.             bean.setTime(times[i]);
  48.             bean.setType(types[i]);
  49.             switch (i){
  50.                 case 0:
  51.                     List<Integer> imgList0 = new ArrayList<>();
  52.                     bean.setImList(imgList0);
  53.                     break;
  54.                 case 1 :
  55.                     List<Integer> imgList1 = new ArrayList<>();
  56.                     bean.setImList(imgList1);
  57.                     break;
  58.                 case 2:
  59.                     List<Integer> imgList2 = new ArrayList<>();
  60.                     imgList2.add(icons2[i-2]);
  61.                     imgList2.add(icons2[i-1]);
  62.                     imgList2.add(icons2[i]);
  63.                     bean.setImList(imgList2);
  64.                     break;
  65.                 case 3:
  66.                     List<Integer> imgList3 = new ArrayList<>();
  67.                     imgList3.add(icons1[i-2]);
  68.                     bean.setImList(imgList3);
  69.                     break;
  70.                 case 4:
  71.                     List<Integer> imgList4 = new ArrayList<>();
  72.                     imgList4.add(icons2[i-1]);
  73.                     imgList4.add(icons2[i]);
  74.                     imgList4.add(icons2[i+1]);
  75.                     bean.setImList(imgList4);
  76.                     break;
  77.                 case 5:
  78.                     List<Integer> imgList5 = new ArrayList<>();
  79.                     imgList5.add(icons1[i-3]);
  80.                     bean.setImList(imgList5);
  81.                     break;
  82.             }
  83.             NewsList.add(bean);
  84.         }
  85.     }
  86. }
复制代码
12. 运行效果展示


到此就做完啦!感谢支持!
还有一些我在做的过程中遇到的一些问题,你本身做的时候是否也遇到了,请参考我 android报错 这个文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表