ViewPager+Fragment+ListView打造新闻列表

27 篇文章 0 订阅

更多源码参考: 

https://download.csdn.net/download/kingmax54212008/10659090

用ViewPager、Fragment和ListView做了一个新闻列表,分享给大家。效果图里上方的指示器是用了第三方工具PagerSlidingTabStrip完成的,非常好用!省去了好多我之前写的监听事件。

首先,我们建一个Activity,然后在新建的Activity的layout中添加两个控件:

前者为第三方工具PagerSlidingTabStrip,后者V4包的ViewPager。

 

 
  1. <com.astuetz.PagerSlidingTabStrip

  2. android:layout_width="match_parent"

  3. android:layout_height="50dp"

  4. android:id="@+id/pst">

  5. </com.astuetz.PagerSlidingTabStrip>

  6.  
  7. <android.support.v4.view.ViewPager

  8. android:layout_width="match_parent"

  9. android:layout_height="match_parent"

  10. android:id="@+id/vp">

  11. </android.support.v4.view.ViewPager>


然后我们建一个空的Fragment。记住,建Fragment的时候先别勾选下面的两个对号,不然的话对于初学者显得有些乱。

 

这Fragment自带的layout中,我们放一个ListView控件。

 

 
  1. <ListView

  2. android:layout_width="match_parent"

  3. android:layout_height="match_parent"

  4. android:id="@+id/lv1">

  5. </ListView>

因为咱是要做新闻列表嘛!当然少不了实体类,好,我们建一个新闻的实体类。

 

 

 
  1. public class News implements Serializable{

  2.  
  3. private String title;

  4. private String pubDate;

  5. private int img;

  6. private int img1;

  7. private int img2;

  8. private int img3;

  9.  
  10. public News(String title, String pubDate, int img, int img1, int img2, int img3) {

  11. this.title = title;

  12. this.pubDate = pubDate;

  13. this.img = img;

  14. this.img1 = img1;

  15. this.img2 = img2;

  16. this.img3 = img3;

  17. }

  18.  
  19. public String getTitle() {

  20. return title;

  21. }

  22.  
  23. public void setTitle(String title) {

  24. this.title = title;

  25. }

  26.  
  27. public String getPubDate() {

  28. return pubDate;

  29. }

  30.  
  31. public void setPubDate(String pubDate) {

  32. this.pubDate = pubDate;

  33. }

  34.  
  35. public int getImg() {

  36. return img;

  37. }

  38.  
  39. public void setImg(int img) {

  40. this.img = img;

  41. }

  42.  
  43. public int getImg1() {

  44. return img1;

  45. }

  46.  
  47. public void setImg1(int img1) {

  48. this.img1 = img1;

  49. }

  50.  
  51. public int getImg2() {

  52. return img2;

  53. }

  54.  
  55. public void setImg2(int img2) {

  56. this.img2 = img2;

  57. }

  58.  
  59. public int getImg3() {

  60. return img3;

  61. }

  62.  
  63. public void setImg3(int img3) {

  64. this.img3 = img3;

  65. }

  66. }

因为新闻列表里的新闻是一条一条呈现在列表里面的,并且都有各自的样式,所以,我们再建一个layout来设计一下新闻的样式。list_simple_layout.xml,简单起见,里面只放了一个图片和一个文本。

 

 

 
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. android:orientation="horizontal"

  4. android:layout_width="match_parent"

  5. android:layout_height="match_parent">

  6. <ImageView

  7. android:layout_marginLeft="2dp"

  8. android:layout_width="match_parent"

  9. android:layout_height="80dp"

  10. android:layout_weight="0.6"

  11. android:scaleType="centerCrop"

  12. android:src="@mipmap/ic_launcher"

  13. android:id="@+id/iv" />

  14. <TextView

  15. android:layout_width="match_parent"

  16. android:layout_height="80dp"

  17. android:layout_weight="0.4"

  18. android:id="@+id/tv"

  19. android:gravity="center"

  20. android:text="34134324124"/>

  21.  
  22.  
  23. </LinearLayout>

大家也都用过新闻软件,你们会发现,在新闻列表中点了某一则新闻,它会跳转到一个新的界面,新的界面呈现的是有关这个新闻完整的信息。所以在这我们再弄一个用来跳转的Activity,并且在它的layout了搞一下布局,随你喜欢。我这里就先只用一个文本框做示例。

 

 

 
  1. <TextView

  2. android:layout_width="match_parent"

  3. android:layout_height="<span style="font-family: Arial, Helvetica, sans-serif;">match_parent</span><span style="font-family: Arial, Helvetica, sans-serif;">"</span>

  4. android:id="@+id/tv"

  5. android:gravity="center"

  6. android:textColor="#408fde"

  7. android:textSize="30sp"/>

 

这里我们需要两个适配器,一个是FragmentViewPager的,一个是FragmentListView的。下面直接给出。

 

 
  1. public class MyFragmentViewAdapter extends FragmentPagerAdapter {

  2. private List<Fragment> list;

  3. private List<String> title;

  4. private Context context;

  5.  
  6. public MyFragmentViewAdapter(FragmentManager fm, List<Fragment> list,List<String> title) {

  7. super(fm);

  8. this.title = title;

  9. this.list = list;

  10. }

  11.  
  12. @Override

  13. public Fragment getItem(int position) {

  14. return list.get(position);

  15. }

  16.  
  17. @Override

  18. public int getCount() {

  19. return list.size();

  20. }

  21.  
  22. @Override

  23. public CharSequence getPageTitle(int position) {

  24. return title.get(position);

  25. }

  26.  
  27. }


 

 

 

 
  1. public class MyListViewAdapter extends BaseAdapter {

  2. private Context context;

  3. private List<News> list;

  4.  
  5. public MyListViewAdapter(Context context, List<News> list) {

  6. this.context = context;

  7. this.list = list;

  8. }

  9.  
  10. @Override

  11. public int getCount() {

  12. return list.size();

  13. }

  14.  
  15. @Override

  16. public Object getItem(int i) {

  17. return list.get(i);

  18. }

  19.  
  20. @Override

  21. public long getItemId(int i) {

  22. return 0;

  23. }

  24. @Override

  25. public View getView(int i, View view, ViewGroup viewGroup) {

  26. ViewHolder vh;

  27. if(view==null){

  28. vh = new ViewHolder();

  29. view = LayoutInflater.from(context).inflate(R.layout.list_simple_layout,null);

  30. vh.img = (ImageView) view.findViewById(R.id.iv);

  31. vh.title = (TextView) view.findViewById(R.id.tv);

  32. view.setTag(vh);

  33. }else {

  34. vh = (ViewHolder) view.getTag();

  35. }

  36. view.setOnClickListener(new View.OnClickListener() {

  37. @Override

  38. public void onClick(View view) {

  39. Intent intent = new Intent(context, Main2Activity.class);

  40. context.startActivity(intent);

  41. }

  42. });

  43. vh.img.setOnClickListener(new View.OnClickListener() {

  44. @Override

  45. public void onClick(View view) {

  46. Toast.makeText(context,"点击图片",Toast.LENGTH_SHORT).show();

  47. }

  48. });

  49. News news = list.get(i);

  50. vh.title.setText(news.getTitle());

  51. vh.img.setImageResource(news.getImg());

  52. return view;

  53. }

  54. public class ViewHolder{

  55. TextView title;

  56. ImageView img;

  57. }

  58.  
  59. }

 

好了,一切准备就绪,重头戏来了,就是我们如何用ViewPager、Fragment、ListView。我会在代码里加上注释进行说明。

首先,一开始的Activity。

 

 
  1. public class ToDayNewsActivity extends AppCompatActivity {

  2. //建两个全局变量,等下用它们获取layout里面的两个控件

  3. private ViewPager vp;

  4. private PagerSlidingTabStrip pst;

  5. @Override

  6. protected void onCreate(Bundle savedInstanceState) {

  7. super.onCreate(savedInstanceState);

  8. setContentView(R.layout.activity_to_day_news);

  9. //这里我改了一下Toolbar的样式,和文章主题无关紧要

  10. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

  11. setSupportActionBar(toolbar);

  12. //用上面的两个全局变量find到控件

  13. vp = (ViewPager) findViewById(R.id.vp);

  14. pst = (PagerSlidingTabStrip) findViewById(R.id.pst);

  15. //建一个List,泛型设为Fragment,用来存放Fragment

  16. List<Fragment> list = new ArrayList<>();

  17. //建一个存放字符串的List,这里是为了用第三方工具PagerSlidingTabStrip而弄的,因为要往里面穿一些参数。

  18. //最后呈现的是上方的可点击指示器

  19. List<String> title = new ArrayList<>();

  20. title.add("体育");

  21. title.add("娱乐");

  22. title.add("奥运");

  23. title.add("财经");

  24. title.add("国际");

  25.  
  26. //来个循环,我这里弄了五次,建了5个ListViewFragment,并且往ListViewFragment里捆绑了一些整数,用于判断

  27. //并区分多种新闻内容

  28. for(int i = 1;i<=5;i++){

  29. Fragment fragment = new ListViewFragment();

  30. Bundle bundle = new Bundle();

  31. bundle.putInt("arg",i);

  32. fragment.setArguments(bundle);

  33. list.add(fragment);

  34. }

  35.  
  36. //将存放了Fragment的列表和指示器的参量加载到适配器中,然后将适配器变量加载到ViewPager中

  37. //最后将ViewPager放到布局的PagerSlidingTabStrip第三方控件里

  38. MyFragmentViewAdapter ma = new MyFragmentViewAdapter(getSupportFragmentManager(),list,title);

  39. vp.setAdapter(ma);

  40. pst.setViewPager(vp);

  41.  
  42. }

  43. }

 
  1. </pre><strong><span style="font-size:18px; color:#996633">接下来是Fragment。</span></strong><p></p><p></p><pre name="code" class="java">public class ListViewFragment extends Fragment {

  2.  
  3.  
  4. public ListViewFragment() {

  5. // Required empty public constructor

  6. }

  7.  
  8.  
  9. @Override

  10. public View onCreateView(LayoutInflater inflater, ViewGroup container,

  11. Bundle savedInstanceState) {

  12. // Inflate the layout for this fragment

  13. return inflater.inflate(R.layout.fragment_list_view, container, false);

  14. }

  15.  
  16. @Override

  17. public void onActivityCreated(@Nullable Bundle savedInstanceState) {

  18. super.onActivityCreated(savedInstanceState);

  19. //这里建一个List用来存放News新闻类

  20. final List<News> list = new ArrayList<>();

  21. //创建了个ListView变量用来获取layout中的ListView

  22. ListView lv1 = (ListView) getView().findViewById(R.id.lv1);

  23. //建一个适配的变量,将上下文和list加载到ListVIew的适配器中,然后放到适配器变量里

  24. MyListViewAdapter ma = new MyListViewAdapter(getActivity(),list);

  25. //将适配器变量的内容加载到List里(也就是把那一堆新闻都放了进去)

  26. lv1.setAdapter(ma);

  27. //获取Activity里传过来的捆绑数据

  28. Bundle bundle = getArguments();

  29. //用来判断是那一中新闻

  30. if(bundle != null){

  31. int arg = bundle.getInt("arg");

  32. switch (arg){

  33. case 1:

  34. for(int i = 1;i<20;i++){

  35. list.add(new News("暴走大事件","刚刚",R.mipmap.mei02,

  36. R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05));

  37. }

  38. ma.notifyDataSetChanged();

  39. break;

  40. case 2:

  41. for(int i = 1;i<20;i++){

  42. list.add(new News("暴走大事件","刚刚",R.mipmap.mei02,

  43. R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05));

  44. }

  45. ma.notifyDataSetChanged();

  46. break;

  47. case 3:

  48. for(int i = 1;i<20;i++){

  49. list.add(new News("推理要在晚饭后","昨天",R.mipmap.mei02,

  50. R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05));

  51. }

  52. ma.notifyDataSetChanged();

  53. break;

  54. case 4:

  55. for(int i = 1;i<20;i++){

  56. list.add(new News("嘿嘿嘿~","晚上",R.mipmap.mei02,

  57. R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05));

  58. }

  59. ma.notifyDataSetChanged();

  60. break;

  61. case 5:

  62. for(int i = 1;i<20;i++){

  63. list.add(new News("- -、守望","凌晨2点",R.mipmap.mei02,

  64. R.mipmap.mei02,R.mipmap.mei02,R.mipmap.mei05));

  65. }

  66. ma.notifyDataSetChanged();

  67. break;

  68. default:break;

  69. }

  70. }

  71.  
  72. //这里用到了监听事件,目的是点击新闻列表中的新闻后跳转到完整的新闻界面

  73. lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  74. @Override

  75. public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

  76. News news = list.get(i);

  77. Toast.makeText(getActivity(),news.getTitle(),Toast.LENGTH_SHORT).show();

  78. Intent intent = new Intent(getActivity(), IntentActivity.class);

  79. intent.putExtra("obj",news);

  80. Bundle bundle1 = new Bundle();

  81. bundle1.putString("arg1","新闻详情");

  82. intent.putExtra("bundle",bundle1);

  83. startActivity(intent);

  84. }

  85. });

  86. }

  87. }


最后是跳转的Activiry的代码。

 

 

 
  1. public class IntentActivity extends AppCompatActivity {

  2.  
  3. @Override

  4. protected void onCreate(Bundle savedInstanceState) {

  5. super.onCreate(savedInstanceState);

  6. setContentView(R.layout.activity_intent);

  7. TextView tv = (TextView) findViewById(R.id.tv);

  8. ImageView iv = (ImageView) findViewById(R.id.iv);

  9. Intent intent = getIntent();

  10. News news = (News) intent.getSerializableExtra("obj");

  11. Bundle bundle = intent.getBundleExtra("bundle");

  12. String arg = bundle.getString("arg1");

  13. StringBuilder sbld = new StringBuilder();

  14. sbld.append(arg+"\n");

  15. sbld.append(news.getTitle()+"\n");

  16. sbld.append(news.getPubDate()+"\n");

  17. tv.setText(sbld.toString());

  18. iv.setImageResource(news.getImg());

  19. }

  20. }

大功告成!
预览图如下:

 

 

 

更多资料:  

https://blog.csdn.net/zhaoyanga14/article/details/52166491 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值