RecyclerView实现加载多种条目类型,仿今日头条首页item

26 篇文章 0 订阅
订阅专栏

在项目开发中会有多种条目的加载需求,今天就来做个RecyclerView加载多条目的类型,仿照今日头条首页列表。先上图看一下
今日头条首页效果。

那么今天我们先来做两个条目,一个是带文字图片的,一个是带文字视频的。首先添加recyclerview依赖:

compile 'com.android.support:recyclerview-v7:21.0.0'
然后从activity中传入到adapter中的数据根据一个type字段判断这个item对象需要的视图,然后return出一个标记,在onCreateViewHolder中在引用所对应的item布局.
@Override
public int getItemViewType(int position) {
    mNews = mNewsList.get(position);
    String newsColumn = mNews.getNewsColumn();
    if("党政新闻".equals(newsColumn)){
        return TYPE_TEXT;
    }else {
        return TYPE_VIDEO;
    }
}
一般有多少种类型我们定义多少种常量
public static final int TYPE_TEXT = 0;
public static final int TYPE_VIDEO = 1;

有了上面定义的常量之后 在onCreateViewHolder里根据viewtype来判断 所引用的item布局类型 这样每一条item就会不一样了
 

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    if(viewType == TYPE_TEXT){
        view =View.inflate(parent.getContext(),R.layout.item_news_content,null);
        return new TextViewHolder(view);
    }else if(viewType == TYPE_VIDEO){
        view =View.inflate(parent.getContext(),R.layout.item_video_content,null);
        return new VideoViewHolder(view);
    }
    return null;
}
然后在onBindViewHolder中加载处理不同的视图呈现的逻辑,接下来贴上完整的代码,便于大家参考。
activity中的代码: 
private void initView() {
        mRecyclerView = (RecyclerView) myNewsView.findViewById(R.id.myNewsListView_id);
        LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(manager);
        //2.当下次再次请求网络的时候,判断本地是否有保存数据,有,加载解析显示缓存数据,
        String sp_msg = SharePreferenceUtils.getString(getActivity(), "news", "");
        if (!TextUtils.isEmpty(sp_msg)) {
            //加载解析显示数据
            processJson(sp_msg);
        }
        //获取Web数据新闻列表
        initWebData();
    }

    //初始化Web数据
    private void initWebData() {
        // 打开加载数据对话框
        String getNewsDataURl = null;
        progressDialog = ProgressDialog.show(getActivity(), "请稍等...", "正在加载数据...", true);
//        getNewsDataURl = getString(R.string.getAllNewsByStatus);
        getNewsDataURl = "https://easydoc.xyz/mock/72378360/82993958/test.video";
        MyGetHttpUtil.mySendHttpRequestUtils(getNewsDataURl,
                new MyHttpCallbackListenerUtil() {
                    @Override
                    public void onFinish(final String response) {
                        //1.请求成功之后,保存数据到本地文件,sp
                        SharePreferenceUtils.saveString(getActivity(), "news", response);
                        //3.加载解析显示最新数据,将缓存数据覆盖
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                progressDialog.dismiss();
                                processJson(response);
                            }
                        });
                    }
                    @Override
                    public void onError(Exception e) {
                        progressDialog.dismiss();
                    }
                });
    }
    /**
     * 4解析json数据操作
     */
    private void processJson(String sp_msg) {
        mNewsList = new Gson().fromJson(sp_msg, new TypeToken<List<News>>() {}.getType());
        mNewsAdapter = new NewsAdapter(Fragment_News.this, myNewsView.getContext(), mNewsList);
        mRecyclerView.setAdapter(mNewsAdapter);
    }

adapter中的代码:

public class NewsAdapter extends RecyclerView.Adapter {

    private Fragment_News tab_news_Fragment;
    private Context mContext;
    private List<News> mNewsList;
    private News mNews;
    public static final int TYPE_TEXT = 0;
    public static final int TYPE_VIDEO = 1;
    public NewsAdapter(Fragment_News fragment_News, Context mContext, List<News> mNewsList) {
        super();
        this.tab_news_Fragment = fragment_News;
        this.mContext = mContext;
        this.mNewsList = mNewsList;
    }

    @Override
    public int getItemCount() {
        return mNewsList.size();
    }
    @Override
    public int getItemViewType(int position) {
        mNews = mNewsList.get(position);
        String newsColumn = mNews.getNewsColumn();
        if("党政新闻".equals(newsColumn)){
            return TYPE_TEXT;
        }else {
            return TYPE_VIDEO;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        if(viewType == TYPE_TEXT){
            view =View.inflate(parent.getContext(),R.layout.item_news_content,null);
            return new TextViewHolder(view);
        }else if(viewType == TYPE_VIDEO){
            view =View.inflate(parent.getContext(),R.layout.item_video_content,null);
            return new VideoViewHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
      if(holder instanceof TextViewHolder){
          TextViewHolder textViewHolder = (TextViewHolder) holder;
          textViewHolder.newsNameTextView.setText(mNews.getNewsTitle());
          textViewHolder.newsContenTextView.setText(mNews.getNewsContent());
          textViewHolder.newsColumnTextView.setText(mNews.getNewsColumn());
          textViewHolder.newsDaTextView.setText(mNews.getNewsDate());
          if (mNews.getNewsImgSrc() != null) {
              AsynImageLoader asynImageLoader = new AsynImageLoader();
              String imgUrl = mNews.getNewsImgSrc();
              asynImageLoader.showImageAsyn(textViewHolder.newsImageView, imgUrl, 0);
          } else {
              textViewHolder.newsImageView.setImageResource(R.drawable.errornotes_pressed);
          }
          textViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  Intent intent = new Intent(mContext, NewsDetailActivity.class);
                  //将当前选中的试卷信息进行传到下一个界面
                  News mNews = mNewsList.get(position);
                  intent.putExtra("currentChoiceNews", mNews);
                  mContext.startActivity(intent);
              }
          });
      }else {
          VideoViewHolder videoViewHolder = (VideoViewHolder) holder;
          videoViewHolder.newsNameTextView.setText(mNews.getNewsTitle());
          videoViewHolder.newsContenTextView.setText(mNews.getNewsContent().trim());
          videoViewHolder.newsColumnTextView.setText(mNews.getNewsColumn());
          videoViewHolder.newsDaTextView.setText(mNews.getNewsDate());
          if (mNews.getNewsImgSrc() != null) {
              AsynImageLoader asynImageLoader = new AsynImageLoader();
              String imgUrl = mNews.getNewsImgSrc();
              asynImageLoader.showImageAsyn(videoViewHolder.newsImageView, imgUrl, 0);
          } else {
              videoViewHolder.newsImageView.setImageResource(R.drawable.errornotes_pressed);
          }
          videoViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  Intent intent = new Intent(mContext, VideoDetailActivity.class);
                  //将当前选中的试卷信息进行传到下一个界面
                  String newsContent = mNewsList.get(position).getNewsContent();
                  intent.putExtra("newsContent", newsContent);
                  mContext.startActivity(intent);
              }
          });
      }
    }
    final class TextViewHolder extends RecyclerView.ViewHolder{
        TextView newsNameTextView;
        TextView newsContenTextView;
        TextView newsColumnTextView;
        TextView newsDaTextView;
        ImageView newsImageView;

        public TextViewHolder(View itemView) {
            super(itemView);
            newsNameTextView = (TextView) itemView.findViewById(R.id.item_News_id);
            newsContenTextView = (TextView) itemView.findViewById(R.id.item_News_desc);
            newsColumnTextView = (TextView) itemView.findViewById(R.id.item_news_column);
            newsDaTextView = (TextView) itemView.findViewById(R.id.itemn_news_date);
            newsImageView = (ImageView) itemView.findViewById(R.id.item_News_img);
        }
    }

    final class VideoViewHolder extends RecyclerView.ViewHolder{
        TextView newsNameTextView;
        TextView newsContenTextView;
        TextView newsColumnTextView;
        TextView newsDaTextView;
        ImageView newsImageView;

        public VideoViewHolder(View itemView) {
            super(itemView);
             newsNameTextView = (TextView) itemView.findViewById(R.id.item_News_id);
             newsContenTextView = (TextView) itemView.findViewById(R.id.item_News_desc);
             newsColumnTextView = (TextView) itemView.findViewById(R.id.item_news_column);
             newsDaTextView = (TextView) itemView.findViewById(R.id.itemn_news_date);
             newsImageView = (ImageView) itemView.findViewById(R.id.item_News_img);
        }
    }
}
以上就是实现多条目布局的完整例子,希望对大家会有帮助,欢迎大家关注评论。

RecyclerView 仿今日头条实现标签管理及动态更新页面内容
刘桂林
06-24 1407
本文较长,阅读大约十分钟在我的知识星球【Hi Android】中,有一位星友提问 如何实现这个功能,刚好,这个也算是一个不错的知识点,类似于今日头条,于是乎,花点时间总结...
android 仿今日头条_Android RecyclerView打造万能ViewPager TabLayout(仿今日头条)
weixin_40002846的博客
11-27 376
文章目录GitHub:https://github.com/AnJiaoDe/TabLayoutNiubility该轮子特异功能如下:使用方法注意:该轮子适用于androidx中的ViewPager2和ViewPager注意:如果轮子死活下载不下来,说明maven地址有毛病,你需要找到jitpack的官网首页,查看最新的官网地址注意:记得去gayhub查看最新版本,最新版本最niubility详细...
Android Studio初学者实例:RecyclerView学习--模仿今日头条
林大大的博客
04-18 5802
XML代码中部分重复样式写入到了style文件中。其中涉及到了适配器,话不多说,上适配器代码。本案例来自于学校的一个简单的课程实验。看一下Activity的Java代码。看一下加入style.xm的l代码。代码解说将会在后续补充。
android实现仿今日头条
06-17
android实现仿今日头条,可以运行。
Android使用RecyclerView实现今日头条频道管理功能
01-20
使用今日头条的伙计们对这个效果肯定很熟悉。拖拽可排序,点击标签后可以删除。今天我们采用RecyclerView实现实现思路: 通过ItemTouchHelper来绑定RecyclerView的子控件触摸事件。 当滑动拖拽的时候,通知适配器来交换两个子控件的显示位置。 更改数据源,使数据源与子空间显示内容一致。 这就是实现的基本思路,是不是很简单?当然,首先要了解一下ItemTouchHelper这哥们儿是干啥的,有什么作用。 This is a utility class to add swipe to dismiss and drag & drop support to Recyc
android 实现仿今日头条推荐列表界面
最新发布
Miaolihong1的博客
05-18 792
界面条目有3种显示形式,第一种是不显示图片,第二种是显示1张,第三种是显示3张,不显示图片和显示1张的形式可以用用相同条目界面,在list_item_one.xml布局文件中设置,显示3张在list_item_two.xml布局文件中设置。还有一些我在做的过程中遇到的一些问题,你自己做的时候是否也遇到了,请参考我 android报错 这个文章!仿今日头条推荐列表界面的背景为浅灰色,底部文字深灰色,在res/values/color.xml中设置。
RecyclerView使用多种Item加载布局
09-02
通过以上步骤,我们就可以实现RecyclerView加载多种布局的列表项。这种方式使得RecyclerView更加灵活,能够适应各种复杂的设计需求,提高了用户体验。在实际开发中,还可以结合DiffUtil类进一步优化数据更新的...
RecyclerView实现Item滑动加载进入动画效果
12-22
本篇文章将详细介绍如何在RecyclerView实现Item滑动加载进入的动画效果。 首先,要实现这一效果,我们需要对RecyclerView的Adapter进行扩展,并在其中创建自定义的ViewHolder。ViewHolder是RecyclerView中的关键...
android RecyclerView实现条目Item拖拽排序与滑动删除
08-31
本文将详细介绍如何在RecyclerView实现条目Item的拖拽排序和滑动删除功能。 首先,我们需要了解RecyclerView的基本用法。在`activity_main.xml`中,我们创建了一个RecyclerView控件,通过设置其宽度和高度以适应...
Android 仿今日头条频道管理,可拖动item进行排列,删除添加
05-31
这个项目"Android 仿今日头条频道管理,可拖动item进行排列,删除添加"提供了一个示例,帮助开发者理解如何在Android环境中创建一个动态、交互性强的频道管理界面。 首先,我们关注的是“频道管理”这一核心概念。...
android studio项目 仿今日头条 Material Design
11-14
基本遵循 Material Design 设计风格 抓包获取今日头条API 使用 Google 官方 MVP 架构 DrawerLayout + NavigationView + BottomNavigationView 搭配使用 RxBus 代替 EventBus 进行组件之间通讯 ViewPager 搭配 Fragment 懒加载 SwipeRefreshLayout 搭配 RecyclerView 下拉刷新上拉加载 自定义 BottomNavigationBehavior 实现上滑隐藏下滑显示 RxJava + Retrofit2 + OkHttp3 做网络请求 OkHttp3 对网络返回内容做缓存, 还有日志、超时重连、头部消息的配置
Android 仿今日头条频道管理 (全)(GridView的Item移动、拖拽)
01-09
Android 仿今日头条项目的频道管理,GridView的移动和拖拽、超强的交互体验 、详情见博客:http://blog.csdn.net/u011916937
安卓 仿今日头条 中级版 完美获取数据,并展示
11-27
(超高仿今日头条 客户端源码最终版 完美实现了获取数据,页面展示,远程同步信息,频道设置,珍惜资源 .自定义控件,重写控件的相关方法 实现: (1)频道管理(带拖拽,动画)Android仿 频道管理----网易、今日头条、腾讯视频 (可以拖动的GridView)附源码DEMO (2) 新闻列表中每个字段按照时间进行排列,并且带有悬浮效果 (3)城市选择列表中的城市信息按照首字母进行排列,并且带有悬浮效果 注意:(1)通过重写GridView。(2)和(3)通过重写ListView,之后通过接口判断是否在最最上方了,进行状态变更,DEMO的代码中可以清晰看懂 2.SQLITE数据库的使用 实现:保存用户设置的频道信息 3.Activity之间的动画跳转方式 4.Animation动画类的相关知识 实现:频道管理中频道的移动动画 5.WebView的相关知识和 jsoup库解析HTML 实现:新闻详情的查看、排版,图片信息的提取。 6.重写ViewPager和ImageView 实现:图片浏览和通过手势放大缩小 7.GestureDetector手势类及OnGestureListener手势监听类的使用 实现:新闻详情页面根据手势滑动来关闭该页面
Android Studio 入门:(三) RecyclerView简单实现
tiandaochouqin_1的博客
03-18 619
(安卓直接连接数据库存在安全隐患) 一、实现效果 抖动手机,可以随机获取数据库里的某条数据。 二、编码思路 (1)手机抖动功能+本地模拟数据验证效果 (2)Python后台搭建 (3)OKhttp的知识了解与运用 三、代码展示 四、那些没有技术含量的坑 五、待完善 ...
android view 管理,Android使用RecyclerView实现今日头条频道管理功能
weixin_28871475的博客
05-25 433
使用今日头条的伙计们对这个效果肯定很熟悉。拖拽可排序,点击标签后可以删除。今天我们采用RecyclerView实现实现思路:通过ItemTouchHelper来绑定RecyclerView的子控件触摸事件。当滑动拖拽的时候,通知适配器来交换两个子控件的显示位置。更改数据源,使数据源与子空间显示内容一致。这就是实现的基本思路,是不是很简单?当然,首先要了解一下ItemTouchHelper这哥...
Android 多布局仿今日头条完美加载多种条目类型RecyclerView
zkbilian的博客
04-26 5057
这个功能在新闻类的APP经常会用到过,这个效果大家都知道,废话不多说,来看我下实现后的效果图跟别的app是否一样: 实现的效果图: 请先看这篇博客,我是用RecyclerView实现的这些功能 根据上一篇博客稍微改动了一下代码: 1.重写getItemViewType方法 根据条件返回条目类型 @Override public int getItem...
android recyclerview多布局_RecyclerView 仿今日头条实现标签管理及动态更新页面内容...
weixin_39913117的博客
11-26 804
在我的知识星球【Hi Android】 中,有一位星友提问 如何实现这个功能,刚好,这个也算是一个不错的知识点,类似于今日头条,于是乎,花点时间总结成一篇文章,供大家阅读这个实现方式很多,但是我首先想到的是使用RecyclerView去做,可能还有很多其他的实现方式,这里我就单指我的思路,来实现这个效果。一.TabLayout + ViewPager主页可以用TabLayout + ViewPag...
android开发:使用FlycoTablayout+ViewPager+RecyclerView打造属于自己的今日头条(一)
一个程序员-二白的博客
10-28 1034
今日我们要写一个demo,仿今日头条主页效果,后续有时间可能还会在这个demo基础上加一些东西,把自己学到的东西整合起来。废话不多说,看下图,app底部有几个Tab,每个Tab中又分几个页面,然后我们可以左右滑动,超过Tab范围后切入到下一个页面,文章最后献上github地址,我们先来看下效果: 先来说一下整体的设计: 1.Activity中放置一个ViewPager ,ViewP...
Android 毕业设计 - 高仿今日头条新闻客户端(内附源码)
程序员徐师兄的博客
01-31 2568
一直都想尝试开发自己还没接触过的某类APP,以前刚入门的时候,就有一个梦想:开发社交类、地图类、新闻类、支付、电商类、直播类、游戏类这些APP。社交类的大二的时候已经开发过一款即时通讯的APP,用的是网易云信的SDK;地图、支付、电商也接触过了;游戏的话做过一个植物大战僵尸的demo,算是Cocos2D的入门;新闻和直播之前公司还没有接到过这些项目的开发,所以一直没机会接触,所以一直很想把当初的梦想实现,做完新闻类和直播类的APP。
recyclerview 仿快手头像挂饰的条目选择
06-06
您好!针对您的问题,您可以通过使用RecyclerView和自定义LayoutManager来实现仿快手头像挂饰的条目选择效果。 具体实现步骤如下: 1. 自定义LayoutManager,实现类似于快手头像挂饰的布局效果,即每个条目可以有多个头像挂饰,并且可以自动换行。 2. 在RecyclerView的Adapter中,为每个条目设置点击事件,记录条目的选中状态。 3. 在LayoutManager中,根据每个条目的选中状态,绘制选中效果,例如添加边框或者改变条目背景颜色等。 4. 当用户点击某个条目时,修改该条目的选中状态,并且通知LayoutManager进行重绘。 通过以上步骤,您可以实现类似于快手头像挂饰的条目选择效果。希望对您有所帮助!
写文章

热门文章

  • 移动端手机抓包工具小助手 17152
  • 目前最精准的Android开源计步器 14296
  • Android中关于闹钟提醒的解决方案 10359
  • Android中高级进阶知识点整理 10341
  • Android 实现WebSocket长连接 9731

分类专栏

  • 性能优化 4篇
  • 算法 4篇
  • 面试题 4篇
  • 项目必备 6篇
  • 艺术探索笔记 10篇
  • 基础类 26篇
  • 进阶类 37篇

最新评论

  • Java-Android面试题重难点集锦(中高级)

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)起一个更符合文章内容的标题。

  • Android 实现WebSocket长连接

    hust_edu_csdn_123: 看不明白表情包

  • RecyclerView实现加载多种条目类型,仿今日头条首页item

    亮亮在江湖: 不好意思,找不到完整的代码了

  • RecyclerView实现加载多种条目类型,仿今日头条首页item

    阿桔桃桃: 博主有完整代码吗?

  • 目前最精准的Android开源计步器

    zyhorse2010: 步数应该是直接获取硬件计步器的吧,而非通过加速度数据计算而来的吧

最新文章

  • Android应用内设置多语言
  • Android图片压缩上传(整体压缩VS单张压缩)
  • Android 倒计时(时间戳转换天、小时、分钟、秒)
2022年4篇
2021年7篇
2020年16篇
2019年24篇
2018年27篇
2017年11篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码大浪网站开发福永SEO按天扣费福永百度seo石岩网站设计模板坑梓SEO按效果付费坪地网站改版广州网站关键词优化大芬百度seo坪山seo民治SEO按天计费坂田网站搜索优化布吉网站优化大运关键词按天计费大运网站推广同乐百度竞价包年推广宝安优化盐田企业网站制作坪山百搜词包深圳网站改版荷坳关键词排名塘坑企业网站建设福永网站优化石岩百度竞价同乐如何制作网站大运网站定制福永百搜词包南澳百度竞价塘坑阿里店铺托管松岗seo排名南联网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化