admin管理员组

文章数量:1660705

文章目录

    • 1. 项目模块功能思维导图
    • 2. 项目涉及到的技术点
    • 3. 项目截图
    • 3. 部分代码实现

1. 基于Android平台开发,仿头条新闻app(一)
2. 基于Android平台开发,仿头条新闻app主页抽屉实现(二)
3. 基于Android平台开发,仿头条新闻app新闻分类左右滑动实现(三)
4. 基于Android平台开发,仿头条新闻app新闻分类分类列表实现(四)
5. 基于Android平台开发,仿头条新闻app新闻详情实现(五)

相关视频教程在某站上面(🔍浩宇软件开发)

1. 项目模块功能思维导图

2. 项目涉及到的技术点

  1. 数据来源:聚合数据API
  2. 使用okhttp网络请求框架获取api数据
  3. 使用gson库解析json数据
  4. 使用RecyclerView+adapter实现新闻列表
  5. 使用SQLite数据库实现用户登录,注册,浏览历史记录
  6. 使用SharedPreferences 实现记住密码登录
  7. 使用TabLayout+ViewPager2实现新闻分类滑动
  8. 使用DrawerLayout+NavigationView实现抽屉
  9. 使用WebView实现新闻详情数据加载
  10. 使用Glide实现新闻图片加载

3. 项目截图







3. 部分代码实现

  1. 欢迎页实现
public class WelcomeActivity extends AppCompatActivity {
    private TextView tvCountdown;

    private CountDownTimer countDownTimer;
    private long timeLeftInMillis = 3000; // 设置倒计时时长,单位为毫秒

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
        //初始化控件
        tvCountdown =findViewById(R.id.tv_countdown);

        // 启动倒计时
        startCountdown();
    }

    private void startCountdown() {
        countDownTimer =new CountDownTimer(timeLeftInMillis,1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                timeLeftInMillis = millisUntilFinished;
                int secondsRemaining = (int) (millisUntilFinished / 1000);
                tvCountdown.setText(secondsRemaining +" s | 跳转");
            }

            @Override
            public void onFinish() {
                //跳转到登录页面(看自己逻辑想跳转哪个页面)
                startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
                // 倒计时结束后的操作,例如跳转到主页面
                finish();

            }
        }.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (countDownTimer != null) {
            countDownTimer.cancel();
        }
    }
}
  1. 首页实现
public class MainActivity extends AppCompatActivity {

    //    private String[] titles = {"娱乐", "军事", "教育", "文化", "将康", "财经", "体育", "汽车", "科技"};
    private List<TitleInfo> titles = new ArrayList<>();
    private TabLayout tab_layout;
    private ViewPager2 viewPager;

    private NavigationView nav_view;

    private TextView tv_username;
    private TextView tv_nickname;

    private ImageView btn_open_drawerLayout;
    private DrawerLayout drawer_layout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化title数据
        titles.add(new TitleInfo("推荐", "top"));
        titles.add(new TitleInfo("国内", "guonei"));
        titles.add(new TitleInfo("国际", "guoji"));
        titles.add(new TitleInfo("娱乐", "yule"));
        titles.add(new TitleInfo("体育", "tiyu"));
        titles.add(new TitleInfo("军事", "junshi"));
        titles.add(new TitleInfo("科技", "keji"));
        titles.add(new TitleInfo("财经", "caijing"));
        titles.add(new TitleInfo("游戏", "youxi"));
        titles.add(new TitleInfo("汽车", "qiche"));
        titles.add(new TitleInfo("健康", "jiankang"));


        //初始化控件
        tab_layout = findViewById(R.id.tab_layout);
        viewPager = findViewById(R.id.viewPager);
        nav_view = findViewById(R.id.nav_view);
        btn_open_drawerLayout = findViewById(R.id.btn_open_drawerLayout);
        drawer_layout = findViewById(R.id.drawer_layout);
        //注意事项, 不能直接findViewById
        //        tv_username=findViewById(R.id.nav_view);
        //        tv_username = nav_view.getHeaderView(0).findViewById(R.id.tv_username);
        tv_username = nav_view.getHeaderView(0).findViewById(R.id.tv_username);
        tv_nickname = nav_view.getHeaderView(0).findViewById(R.id.tv_nickname);



        //btn_open_drawerLayout打开抽屉
        btn_open_drawerLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                drawer_layout.open();
            }
        });


        //nav_view点击事件
        nav_view.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                if (item.getItemId() == R.id.nav_history) {
                    //跳转到历史记录
                    Intent intent = new Intent(MainActivity.this, HistoryListActivity.class);
                    startActivity(intent);
                } else if (item.getItemId() == R.id.nav_update_pwd) {

                    //判断是否登录
                    UserInfo userInfo = UserInfo.getUserInfo();
                    if (null != userInfo) {
                        startActivity(new Intent(MainActivity.this, UpdatePwdActivity.class));
                    } else {
                        Toast.makeText(MainActivity.this, "请先登录~~", Toast.LENGTH_SHORT).show();
                    }

                } else if (item.getItemId() == R.id.nav_about) {
                    startActivity(new Intent(MainActivity.this, AboutActivity.class));


                } else if (item.getItemId() == R.id.nav_exit) {
                    UserInfo userInfo = UserInfo.getUserInfo();
                    if (null!=userInfo){
                        new AlertDialog.Builder(MainActivity.this).setTitle("温馨提示").setMessage("确认要退出登录吗?").setPositiveButton("确认", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {

                                        startActivity(new Intent(MainActivity.this, LoginActivity.class));
                                        UserInfo.setUserInfo(null);
                                    }
                                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {

                                    }
                                })
                                .show();
                    }else {
                        Toast.makeText(MainActivity.this, "请先登录~~", Toast.LENGTH_SHORT).show();
                    }

                }

                return true;
            }
        });


        //viewPager 需要设置一个adapter
        viewPager.setAdapter(new FragmentStateAdapter(this) {
            @NonNull
            @Override
            public Fragment createFragment(int position) {
                String title = titles.get(position).getPy_title();
                TabNewsFragment tabNewsFragment = TabNewsFragment.newInstance(title);
                return tabNewsFragment;
            }

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

        //tab_layout点击事件
        tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //设置viewPager选中当前页
                viewPager.setCurrentItem(tab.getPosition(), false);

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });


        //tab_layout和viewPager关联在一起
        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tab_layout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                tab.setText(titles.get(position).getTitle());
            }
        });


        //这句话一定不能少
        tabLayoutMediator.attach();

    }

    @Override
    protected void onResume() {
        super.onResume();

        UserInfo userInfo = UserInfo.getUserInfo();
        if (null != userInfo) {
            tv_username.setText(userInfo.getUsername());
            tv_nickname.setText(userInfo.getNickname());
        } else {
            tv_username.setText("请登录");
            tv_nickname.setText("");
            //登录点击事件
            tv_username.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, LoginActivity.class);
                    startActivity(intent);
                }
            });
        }


    }
}
  1. 新闻详情页
public class NewsDetailsActivity extends AppCompatActivity {
    private NewsInfo.ResultDTO.DataDTO dataDTO;
    private Toolbar toolbar;
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_details);

        //初始化控件
        toolbar = findViewById(R.id.toolbar);
        mWebView = findViewById(R.id.webView);

        //获取传递的数据
        dataDTO = (NewsInfo.ResultDTO.DataDTO) getIntent().getSerializableExtra("dataDTO");

        //设置数据
        if (null != dataDTO) {
            toolbar.setTitle(dataDTO.getTitle());
            mWebView.loadUrl(dataDTO.getUrl());

            //添加历史记录
            String dataDTOJson = new Gson().toJson(dataDTO);
            UserInfo userInfo = UserInfo.getUserInfo();
            if (userInfo!=null){
                HistoryDbHelper.getInstance(NewsDetailsActivity.this).addHistory(userInfo.getUsername(),dataDTO.getUniquekey(),dataDTOJson);
            }else {
                HistoryDbHelper.getInstance(NewsDetailsActivity.this).addHistory(null,dataDTO.getUniquekey(),dataDTOJson);
            }

        }


        //返回
        toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });






    }
}

本文标签: 头条平台新闻androidapp