Android简易新闻客户端
来源:互联网 发布:微商专用软件 编辑:程序博客网 时间:2024/06/05 17:41
文件目录
在app/build.gradle当中添加依赖库
apply plugin: 'com.android.application'android { compileSdkVersion 24 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.example.fragmentbestpractice" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:recyclerview-v7:24.2.1'//recyclerview库 testCompile 'junit:junit:4.12'}
新闻的实体类
package com.example.fragmentbestpractice;public class News { private String title; private String content; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; }}
新闻内容的布局(news_content_frag.xml)
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/visibility_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:visibility="invisible"> <TextView android:id="@+id/news_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:textSize="20sp"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#000"/> <TextView android:id="@+id/news_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:padding="15dp" android:textSize="18sp"/> </LinearLayout> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:background="#000"/></RelativeLayout>
新闻内容的布局类(NewsContentFragment)
package com.example.fragmentbestpractice;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class NewsContentFragment extends Fragment { private View view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.news_content_frag,container,false); return view; } public void refresh(String newsTitle, String newsContent) { View visibilityLayout = view.findViewById(R.id.visibility_layout); visibilityLayout.setVisibility(View.VISIBLE); TextView newsTitleText = (TextView) view.findViewById(R.id.news_title); TextView newsContentText = (TextView) view.findViewById(R.id.news_content); newsTitleText.setText(newsTitle); newsContentText.setText(newsContent); }}
- onCreateView()方法里加载了刚才创建的布局
- refresh()方法将新闻的标题和内容显示出来
创建单页使用的活动(NewsContentActivity)并修改activity_news_content.xml
修改单页使用的活动(NewsContentActivity)
package com.example.fragmentbestpractice;import android.content.Context;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class NewsContentActivity extends AppCompatActivity { public static void actionStart(Context context, String newsTitle, String newsContent) { Intent intent = new Intent(context,NewsContentActivity.class); intent.putExtra("news_title", newsTitle); intent.putExtra("news_content", newsContent); context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_news_content); String newsTitle = getIntent().getStringExtra("news_title"); String newsContent = getIntent().getStringExtra("news_content"); NewsContentFragment newsContentFragment = (NewsContentFragment) getSupportFragmentManager().findFragmentById(R.id.news_content_fragment); newsContentFragment.refresh(newsTitle, newsContent); }}
- onCreate()方法中通过Intent获取到了传入的新闻标题和新闻内容,然后调用了FragmentManager的findFragmentById()方法得到了NewsContentFragment的实例,接着调用它的refresh()方法来传入新闻标题和内容。
- actionStart()方法使Intent传递的数据一目了然
创建用于显示新闻列表的布局(news_title_frag.xml)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/news_title_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
- 里面只有一个显示新闻列表的RecyclerView
创建RecyclerView子项的布局(news_item.xml)
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/news_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" android:textSize="18sp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="15dp" android:paddingBottom="15dp"/>
- android:ellipsize用于指定当文本内容超出控件宽度时,文本的缩略方式,end表示在尾部进行缩略。
创建NewsTitleFragment作为展示新闻列表的碎片
package com.example.fragmentbestpractice;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import java.util.Random;public class NewsTitleFragment extends Fragment { private boolean isTwoPane; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.news_title_frag, container, false); RecyclerView newsTitleRecyclerView = (RecyclerView) view.findViewById(R.id.news_title_recycler_view); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); newsTitleRecyclerView.setLayoutManager(layoutManager); NewsAdapter adapter = new NewsAdapter(getNews()); newsTitleRecyclerView.setAdapter(adapter); return view; } private List<News> getNews() { List<News> newsList = new ArrayList<>(); for (int i = 1; i <= 50; i++) { News news = new News(); news.setTitle("This is news title" + i); news.setContent(getRandomLengthContnet("This is news contnet" + i + ".")); newsList.add(news); } return newsList; } private String getRandomLengthContnet(String content) { Random random = new Random(); int length = random.nextInt(20) + 1; StringBuilder builder = new StringBuilder(); for (int i = 0; i < length; i++) { builder.append(content); } return builder.toString(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getActivity().findViewById(R.id.news_content_layout) != null) { isTwoPane = true; } else { isTwoPane = false; } } class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> { private List<News> mNewsList; class ViewHolder extends RecyclerView.ViewHolder { TextView newsTitleText; public ViewHolder(View view) { super(view); newsTitleText = (TextView) view.findViewById(R.id.news_title); } } public NewsAdapter(List<News> newsList) { mNewsList = newsList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false); final ViewHolder holder = new ViewHolder(view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { News news = mNewsList.get(holder.getAdapterPosition()); if (isTwoPane) { NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.news_content_fragment); newsContentFragment.refresh(news.getTitle(),news.getContent()); } else { NewsContentActivity.actionStart(getActivity(),news.getTitle(),news.getContent()); } } }); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { News news = mNewsList.get(position); holder.newsTitleText.setText(news.getTitle()); } @Override public int getItemCount() { return mNewsList.size(); } }}
- onCreateView()方法中加载了news_title_frag布局和RecyclerView的使用
- onActivityCreated()这个方法通过判断在活动中是否能找到news_content_layout布局来确定加载的单/双页模式,我们让news_content_layout在双页模式中才出现
- 将适配器写成内部类可以直接访问NewsTitleFragment的内部变量
- onCreateViewHolder()中注册的点击事件,先判断单双页,如果是单页,就启动新的活动,如果是双页,就更新新闻内容碎片里的数据。
- Random类的public int nextInt(int n)方法:该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。
- String对象是不可改变的。每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能。
实现单双页(修改activity_main.xml)
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/news_title_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/news_title_fragment" android:name="com.example.fragmentbestpractice.NewsTitleFragment" android:layout_width="match_parent" android:layout_height="match_parent"/></FrameLayout>
- 单页模式下,加载一个新闻标题的碎片
实现单双页(新建layout-sw600dp\activity_main.xml)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/news_title_fragment" android:name="com.example.fragmentbestpractice.NewsTitleFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <FrameLayout android:id="@+id/news_content_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3"> <fragment android:id="@+id/news_content_fragment" android:name="com.example.fragmentbestpractice.NewsContentFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout></LinearLayout>
- 在双页模式中同时引入两个碎片,并将新闻内容的碎片放在了id为news_content_layout的FrameLayout布局下
效果图
阅读全文
0 0
- Android简易新闻客户端
- Android---网络编程之简易新闻客户端
- 简易新闻客户端
- 简易新闻客户端案例
- 简易新闻客户端
- 案例-----简易新闻客户端
- android开发笔记之网络编程—简易新闻客户端
- 简易新闻客户端(生成列表)
- 安卓开发之简易新闻客户端
- 网络编程案例简易新闻客户端
- Android 新闻客户端开发
- android 新闻客户端开发
- android csdn新闻客户端
- Android 新闻客户端
- Android-新闻客户端
- android之新闻客户端
- Android 新闻客户端
- 新闻客户端android
- matlab语法——subplot函数
- 拜访---动态规划
- Swift 结构体指针
- 排序笔记
- Python学习笔记(十四)-- Python文件I/O(二)
- Android简易新闻客户端
- GenericServlet 为无法解析类型
- 远程连接mysql错误1130代码的方法
- python搞事情
- Android事件传递机制详解及最新源码分析——View篇
- python3读写csv格式文件
- Regexper 本地安装
- 输入小写字母,输出此字母之后的第五个大写字母(软通动力2017校招面试题) 如:输入小写的a,输出F
- C++学习13:读写文本文件