Android简易新闻客户端

来源:互联网 发布:微商专用软件 编辑:程序博客网 时间:2024/06/05 17:41

文件目录

news

在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布局下

效果图

pad


mob1

mob2

原创粉丝点击