Android 之 Fragment 精讲——新闻(购物)类 App 列表 Fragment 的简单实现

2023-11-13

本节引言:

相信大家对点击列表,然后进入详情这种App并不陌生吧,在购物类App和新闻类App中最为常见: 下面我们简单来讲一下流程逻辑!


1.逻辑流程讲解:

刚好公司测试的APP,呵呵,直接就照这个来研究吧:

 

嘿嘿,市面上很多APP都是这种样子的,而这个可以用我们学到的Fragment来实现: 可能gif动画看不清,笔者用界面原型工具画个大概吧:

 大概就这样,中间区域是一个布局容器,一般是FrameLayout,然后我们将一个Fragment replace 到这个容器中或者add也行,而这个Fragment中有一个listview,当我们点击这个ListView中的一项, 中间容器中的Fragment就会被replace成对应详细信息的Fragment所替代,如果我们只是replace的话, 就不会保存第一个Fragment的状态,用户又得从头开始浏览,这肯定是很不方便的,这里我们可以 通过Fragment栈的addtobackStack和popbackstack来解决这个问题!当replace的同时,我们将被替换 的Fragment添加到stack中,当用户点击回退按钮时,调用popbackstack弹出栈,具体实现见下述代码 示例!


2.代码示例:简单新闻类APP列表和内容切换的实现

运行效果图

实现代码

Step 1:先把两个Fragment以及Activity的布局实现了

fg_newlist.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/list_news"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

fg_context.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textColor="@color/blue"
        android:textSize="20sp" />

</LinearLayout>

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/blue"
        android:textColor="@color/white"
        android:text="新闻列表"
        android:textSize="20sp"
        android:textStyle="bold"
        android:gravity="center"/>

    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/txt_title"/>

</RelativeLayout>

Step 2:实现我们的业务Bean类和自定义BaseAdapter类:

Data.java:

/**
 * Created by Jay on 2015/9/6 0006.
 */
public class Data {

    private String new_title;
    private String new_content;

    public Data(){}

    public Data(String new_title, String new_content) {
        this.new_title = new_title;
        this.new_content = new_content;
    }

    public String getNew_title() {
        return new_title;
    }

    public String getNew_content() {
        return new_content;
    }

    public void setNew_title(String new_title) {
        this.new_title = new_title;
    }

    public void setNew_content(String new_content) {
        this.new_content = new_content;
    }
}

MyAdapter.java:

/**
 * Created by Jay on 2015/9/6 0006.
 */
public class MyAdapter extends BaseAdapter{

    private List<Data> mData;
    private Context mContext;

    public MyAdapter(List<Data> mData, Context mContext) {
        this.mData = mData;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.txt_item_title = (TextView) convertView.findViewById(R.id.txt_item_title);
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.txt_item_title.setText(mData.get(position).getNew_title());
        return convertView;
    }

    private class ViewHolder{
        TextView txt_item_title;
    }

}

Step 3:MainActivity的实现

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private TextView txt_title;
    private FrameLayout fl_content;
    private Context mContext;
    private ArrayList<Data> datas = null;
    private FragmentManager fManager = null;
    private long exitTime = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        fManager = getFragmentManager();
        bindViews();

        datas = new ArrayList<Data>();
        for (int i = 1; i <= 20; i++) {
            Data data = new Data("新闻标题" + i, i + "~新闻内容~~~~~~~~");
            datas.add(data);
        }
        NewListFragment nlFragment = new NewListFragment(fManager, datas);
        FragmentTransaction ft = fManager.beginTransaction();
        ft.replace(R.id.fl_content, nlFragment);
        ft.commit();
    }


    private void bindViews() {
        txt_title = (TextView) findViewById(R.id.txt_title);
        fl_content = (FrameLayout) findViewById(R.id.fl_content);
    }


    //点击回退键的处理:判断Fragment栈中是否有Fragment
    //没,双击退出程序,否则像是Toast提示
    //有,popbackstack弹出栈
    @Override
    public void onBackPressed() {
        if (fManager.getBackStackEntryCount() == 0) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                super.onBackPressed();
            }
        } else {
            fManager.popBackStack();
            txt_title.setText("新闻列表");
        }
    }
}

Step 4:列表Fragment的实现:

NewListFragment.java

package com.jay.fragmentdemo4;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Jay on 2015/9/6 0006.
 */
public class NewListFragment extends Fragment implements AdapterView.OnItemClickListener {
    private FragmentManager fManager;
    private ArrayList<Data> datas;
    private ListView list_news;

    public NewListFragment(FragmentManager fManager, ArrayList<Data> datas) {
        this.fManager = fManager;
        this.datas = datas;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fg_newlist, container, false);
        list_news = (ListView) view.findViewById(R.id.list_news);
        MyAdapter myAdapter = new MyAdapter(datas, getActivity());
        list_news.setAdapter(myAdapter);
        list_news.setOnItemClickListener(this);
        return view;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        FragmentTransaction fTransaction = fManager.beginTransaction();
        NewContentFragment ncFragment = new NewContentFragment();
        Bundle bd = new Bundle();
        bd.putString("content", datas.get(position).getNew_content());
        ncFragment.setArguments(bd);
        //获取Activity的控件
        TextView txt_title = (TextView) getActivity().findViewById(R.id.txt_title);
        txt_title.setText(datas.get(position).getNew_content());
        //加上Fragment替换动画
        fTransaction.setCustomAnimations(R.anim.fragment_slide_left_enter, R.anim.fragment_slide_left_exit);
        fTransaction.replace(R.id.fl_content, ncFragment);
        //调用addToBackStack将Fragment添加到栈中
        fTransaction.addToBackStack(null);
        fTransaction.commit();
    }
}

Step 5:内容Fragment的实现:

NewContentFragment.java:

/**
 * Created by Jay on 2015/9/6 0006.
 */
public class NewContentFragment extends Fragment {

    NewContentFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fg_content, container, false);
        TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
        //getArgument获取传递过来的Bundle对象
        txt_content.setText(getArguments().getString("content"));
        return view;
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 之 Fragment 精讲——新闻(购物)类 App 列表 Fragment 的简单实现 的相关文章

  • 关于 inflater.inflate Android 文档的困惑

    我正在研究此链接中的片段 http developer android com guide components fragments html http developer android com guide components frag
  • 单击应用程序的启动图标时会发生什么?

    单击应用程序的启动图标时会发生什么 是否总是发送新意图 或者结果有时与从最近的任务恢复任务相同 如果发送意图 它何时被发送到新活动实例的 onCreate 方法以及何时通过现有活动的 onNewIntent 进行路由 假设意图通过任务中现有
  • 为什么 Android 服务在测试时不是单例的?

    当运行大量测试套件时 我注意到我的一个 Android 服务不再是单例的 Android 服务应该是单例的 但是当使用 ServiceTestCase 时 我的引用计数超过 1 在 onCreate 中递增 在 onDestroy 中递减
  • 围绕二维坐标系中的特定点缩放

    Below is an image my coordinate system 我想做的是 我想开始围绕画布中的特定点进行缩放 缩放工作正常 但我的问题是我不知道如何计算缩放时移动画布的量 请注意 我我没有使用canvas scale 我只是
  • Android 通知 - 显示完整消息

    我的 Android 应用程序必须能够向一大群人发送简短的警报 执行此操作的明显位置是在通知中心 完整的通知毫无问题地显示在股票代码中 但在通知中心 用户只能看到前几个单词 然后是省略号 通知并不长 最多也就10 15个字 如何使文本自动换
  • 自定义视图的Ondraw无限循环android

    我的自定义视图的 OnDraw 函数被无限调用并且正在循环 可能的原因是什么 这是我的自定义视图 public class Balls extends View private static final String TAG BallsVi
  • 屏幕滚动时 GridView 内的项目会重复

    我使用 GridView 来显示一组用户可以选择的类别 网格的每个项目都由一个 ImageView 和一个 TextView 组成 两者都是从服务器检索的 当触摸一个项目时 另一个活动就会启动 我以为一切都很顺利 直到我注意到当我滚动屏幕时
  • 在 Marshmallow 中获取蓝牙本地 mac 地址

    在 Marshmallow 之前 我的应用程序将通过以下方式获取其设备 MAC 地址BluetoothAdapter getDefaultAdapter getAddress 现在 随着 Marshmallow Android 的回归02
  • Kotlin Room 数据库单例模式

    我正在尝试创建单人房间数据库 我找到了两种解决方案 但我不知道它们之间有什么区别 根据这个文件 companion object Volatile private var INSTANCE AppDatabase null fun getI
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • 检查应用程序是否首次运行[重复]

    这个问题在这里已经有答案了 我是 Android 开发新手 我想根据应用程序安装后首次运行来设置一些应用程序的属性 有什么方法可以发现应用程序是第一次运行 然后设置其首次运行属性吗 下面是一个使用的例子SharedPreferences实现
  • 开始使用 Honeycomb 进行 Android 开发 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android - 主页按钮发出什么意图?

    我想知道设备的主页按钮到底执行什么操作 即 当您单击主页按钮时会发出什么意图 意图类别和操作 回到空白的主屏幕 我想知道在单击我自己的自定义按钮时实现此操作涉及什么 谢谢 PS我知道这不是标准的 但我的设备也不是 如果您想显示主屏幕 可以通
  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 从包中发布的错误通知无法展开 RemoteViews

    我有个问题 有时我的服务会被这个 logcat 强制关闭 03 26 20 44 44 849 E AndroidRuntime 12080 FATAL EXCEPTION main 03 26 20 44 44 849 E Android
  • 无法通过usb调试安装android应用程序

    我知道这是一个老问题 但我第一次尝试在 Redmi note 4 上安装我的应用程序 每当我尝试安装时 它都会显示一个对话框 安装失败 并显示消息无法建立会话 通过卸载现有版本的 apk 如果存在 然后重新安装 可能可以解决此问题 警告 卸
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是
  • 如何检测用户是否禁用 GPS(Android - Play 服务)

    我使用 gms location LocationListener Google Play 服务 来获取用户的位置 它工作正常 但我想检测用户何时禁用或启用他 她的 GPS 就像这张照片一样 当我打开 关闭位置时 不会调用任何方法 当我切换

随机推荐

  • 瞎玩物联网系列--Hello 树莓派

    条件 Raspberry Pi 3b 32G存储卡 mac 网线 面包板 led灯 杜邦线 传感器若干 系统安装 各种下载 官方镜像下载 树莓派实验室地址 刻录工具 etcher Microsoft Remote Desktop for M
  • 二叉搜索树的定义、查找、插入和删除

    二叉搜索树的定义 查找 插入和删除 原创 2016年07月21日 21 59 00 二叉搜索树的定义 二叉搜索树 也称有序二叉树 排序二叉树 是指一棵空树或者具有下列性质的二叉树 1 若任意节点的左子树不空 则左子树上所有结点的值均小于它的
  • 不用swap分区,用交换文件(转)

    不用swap分区 用交换文件 转 more 安装linux时 一般系统都要求划分一个分区作为交换分区 但现时大家的电脑内存一般都很大 系统交换文件的机会会越来越少 就以我的来说 本人安装的是redhat linux V7 3 内存是256M
  • BGP距离协议①

    边界网关协议 边界网关协议分为内部网关协议和外部网关协议 IGP 内部网关协议 RIP OSPF EGP 外部网关协议 BGP AS自治系统 由单一的机构 组织所管理的一系列IP网络及设备所构成的集合 使用AS自治系统来划分内部和外部网关协
  • 数据库原理 具有检查点的恢复技术

    1 为什么需要检查点 搜索整个日志文件需要耗费的时间很多 重做处理 重新执行 耗费了大量的时间 2 解决方案是什么 在日志文件中增加检查点 check point 记录 增加重新开始文件 恢复子系统在登录日志文件期间动态的维护日志 3 检查
  • CPU测试相关工具搜集

    CPU测试相关工具搜集 一 y cruncher CPU性能测试工具 二 CPU Z CPU参数查看工具 三 cachesize 读取CPU Cache信息 四 Flops CPU浮点运算性能测试工具 五 Open Hardware Mon
  • IDEA找不到Maven窗口

    有时候导入项目或者创建项目时候Maven窗口找不到了 然后指定项目的pom xml文件
  • 缘结西安

    2021年6月1日上午 CSDN创始人 董事长蒋涛 首席运营官钟晖 副总裁李超 长沙首席技术官陈玉龙 高校俱乐部负责人张建龙 市场总监段思倍等到达西安思源学院 与学校就校企合作达成共识 正式结为校企战略合作伙伴 下午 CSDN董事长蒋涛以
  • C++基础——拷贝构造函数

    前言 在上篇文章中 我简单介绍了一下类的两大特殊函数 构造函数和析构函数 构造函数主要用来进行对象的成员变量初始化操作 而析构函数主要用来对战斗后的战场做清理工作 当我们不写这些函数时 编译器会自动生成默认的构造与析构函数 帮助我们合理的运
  • 数据挖掘:探索性数据分析(EDA)

    数据挖掘 探索性数据分析 EDA 一 什么是探索性数据分析 EDA Exploratory Data Analysis 即对数据进行探索性的分析 充分了解数据 为之后的数据清洗和特征工程等提供想法和结论 在探索分析时 也可进行数据清洗的工作
  • 二维字符数组中字符串查找

    首先输入一个数字N 接着输入N行字符 每个字符用逗号分隔 最终形成一个N N的字符数组 然后再输入一个待查找的目标字符串 在上面字符数组中查找是否出现目标字符串 查找的规则是在起始位置 从左向右 或者 从上向下 每个单元格的字符只出现一次
  • 百度网盘 文件名中(文件)含有敏感词

    百度网盘 文件名中含有敏感词 CreateTime 2018年5月3日08 17 58 Author Marydon 1 情景还原 2 解决方案 新建一个文件夹 gt 分享 分享成功 再将真正要分享的文件移动到已经分享的文件夹下 即可 测试
  • 【WSN通信】能量均衡的无线传感器网络非均匀分簇路由协议附matlab代码

    1 简介 提出了一种能量高效均衡 非均匀分簇和簇间多跳路由有机结合的无线传感器网络分布式分簇路由协议DEBUC distributed energy balanced unequal clustering routing protocol
  • 软考考试多少分算通过?

    软考证书取得需要达到总分45分 每门科目满分为75分 因此 不要小看45分 在考试中获得这个分数并不容易 此外 软考要求一次性通过 如果没有通过 成绩将不被保留 因此 必须在一次考试中成功通过所有科目 否则就需要重新参加考试 如果考生只通过
  • 如何在ubuntu交叉编译qt5程序发布到rk3568 Linux开发板运行?

    如何在ubuntu交叉编译qt5程序发布到rk3568 Linux开发板运行 本文将介绍如何在ubuntu搭建qt的开发环境和第一个helloworld程序的创建 构建过程 1 下载安装交叉编译工具 拷贝 rk3568 linux preb
  • java图片压缩,使用ImageIO代替JPEGImageEncoder

    最近做项目需要图片压缩处理 网上找的方法大都使用了 com sun image codec jpeg 这个包中的JPEGImageEncoder类 引入这个包后一直报错 各种google百度 尝试了各种方法 包括手动引jre中的rt jar
  • Stata打开自带的数据合集

    1 sysuse命令 这个命令是用来打开stata内置的数据 sysues dir 列出自带数据的目录 第一列的数据为股票的数据 分别是宁德时代 深证成指 贵州茅台 东方证券 auto dta是1978年在美国销售的74个车牌号的汽车的技术
  • 【项目功能模块】SpringBoot+vue实现登录图片验证码

    SpringBoot vue实现登录图片验证码 要在Spring Boot和Vue中实现登录时的图片验证码功能 可以按照以下步骤进行操作 后端 Spring Boot 实现 添加相关依赖 在 pom xml文件中添加以下依赖
  • 召回层-item与item之间相似度矩阵计算方式:①基于“共有用户”的相似性计算(考虑多种因素的权重计算最终的文章之间的相似度);②基于item之间向量相似度计算(物品的向量可通过各种方式预先计算出)

    一 item与item之间基于 共有用户 的相似性计算相似度矩阵 文章与文章之间的基于 共有用户 的相似性矩阵计算 考虑多种因素的权重计算最终的文章之间的相似度 def item cf sim df item created time di
  • Android 之 Fragment 精讲——新闻(购物)类 App 列表 Fragment 的简单实现

    本节引言 相信大家对点击列表 然后进入详情这种App并不陌生吧 在购物类App和新闻类App中最为常见 下面我们简单来讲一下流程逻辑 1 逻辑流程讲解 刚好公司测试的APP 呵呵 直接就照这个来研究吧 嘿嘿 市面上很多APP都是这种样子的