客户端上显示csdn上的各类别下的的文章列表 (制作csdn app 三)

本文介绍如何在Android应用中使用Fragment和XListView实现动态数据加载和展示,包括ViewPagerIndicator的集成,以及从网络获取数据并更新UI的过程。
               

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/23597229

今天将在Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架抓取csdn上的各类别的文章 (制作csdn app 二)这两篇的基础之上,继续完善我们的项目。

今天的目标效果:

好了,说下今天的主要任务:引入XlistView,然后对从网络上获取的数据进行显示,说起来还是挺轻松的,不过咱们的app看起来已经很不错了。

进入正题。

1、首先当然是实现承诺,把我们第二篇博客中的制作好的jar引入我们的项目。



注意我们的csdn_splider.jar依赖于jsoup.jar,不但两个都需要引入,而且需要jsoup在前,不然可能会报ClassNotFoundException。

2、MainActivity没有变化,但还是贴一下代码,方便大家的理解。

package com.zhy.csdndemo;import com.viewpagerindicator.TabPageIndicator;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.view.ViewPager;public class MainActivity extends FragmentActivityprivate TabPageIndicator mIndicator ; private ViewPager mViewPager ; private FragmentPagerAdapter mAdapter ; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   mIndicator = (TabPageIndicator) findViewById(R.id.id_indicator);  mViewPager = (ViewPager) findViewById(R.id.id_pager);  mAdapter = new TabAdapter(getSupportFragmentManager());  mViewPager.setAdapter(mAdapter);  mIndicator.setViewPager(mViewPager, 0);     }  }

主要的工作都是在MainFragment.java中完成。

package com.zhy.csdndemo;import java.util.ArrayList;import java.util.List;import me.maxwin.view.IXListViewLoadMore;import me.maxwin.view.IXListViewRefreshListener;import me.maxwin.view.XListView;import android.annotation.SuppressLint;import android.os.AsyncTask;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.zhy.bean.CommonException;import com.zhy.bean.NewsItem;import com.zhy.biz.NewsItemBiz;import com.zhy.csdn.Constaint;import com.zhy.csdndemo.adapter.NewsItemAdapter;@SuppressLint("ValidFragment")public class MainFragment extends Fragment implements IXListViewRefreshListener, IXListViewLoadMore/**  * 默认的newType  */ private int newsType = Constaint.NEWS_TYPE_YEJIE; /**  * 当前页面  */ private int currentPage = 1/**  * 处理新闻的业务类  */ private NewsItemBiz mNewsItemBiz; /**  * 扩展的ListView  */ private XListView mXListView; /**  * 数据适配器  */ private NewsItemAdapter mAdapter;  /**  * 数据  */ private List<NewsItem> mDatas = new ArrayList<NewsItem>(); /**  * 获得newType  * @param newsType  */ public MainFragment(int newsType) {  this.newsType = newsType;  mNewsItemBiz = new NewsItemBiz(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  return inflater.inflate(R.layout.tab_item_fragment_main, null); } @Override public void onActivityCreated(Bundle savedInstanceState) {  super.onActivityCreated(savedInstanceState);  mAdapter = new NewsItemAdapter(getActivity(), mDatas);  /**   * 初始化   */  mXListView = (XListView) getView().findViewById(R.id.id_xlistView);  mXListView.setAdapter(mAdapter);  mXListView.setPullRefreshEnable(this);  mXListView.setPullLoadEnable(this);  //mXListView.NotRefreshAtBegin();  /**   * 进来时直接刷新   */  mXListView.startRefresh(); } @Override public void onRefresh() {  new LoadDatasTask().execute(); } @Override public void onLoadMore() {  // TODO Auto-generated method stub } /**  * 记载数据的异步任务  * @author zhy  *  */ class LoadDatasTask extends AsyncTask<Void, Void, Void{  @Override  protected Void doInBackground(Void... params)  {   try   {    List<NewsItem> newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);    mDatas = newsItems;   } catch (CommonException e)   {    // TODO Auto-generated catch block    e.printStackTrace();   }   return null;  }  @Override  protected void onPostExecute(Void result)  {   mAdapter.addAll(mDatas);   mAdapter.notifyDataSetChanged();   mXListView.stopRefresh();  } }}

MainActivity中需要一个数据适配器,也就是NewsItemAdapter.java

package com.zhy.csdndemo.adapter;import java.util.List;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import com.zhy.bean.NewsItem;import com.zhy.csdn.DataUtil;import com.zhy.csdndemo.R;public class NewsItemAdapter extends BaseAdapterprivate LayoutInflater mInflater; private List<NewsItem> mDatas;  /**  * 使用了github开源的ImageLoad进行了数据加载  */ private ImageLoader imageLoader = ImageLoader.getInstance(); private DisplayImageOptions options; public NewsItemAdapter(Context context, List<NewsItem> datas) {  this.mDatas = datas;  mInflater = LayoutInflater.from(context);    imageLoader.init(ImageLoaderConfiguration.createDefault(context));  options = new DisplayImageOptions.Builder().showStubImage(R.drawable.images)    .showImageForEmptyUri(R.drawable.images).showImageOnFail(R.drawable.images).cacheInMemory()    .cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).displayer(new FadeInBitmapDisplayer(300))    .build(); } public void addAll(List<NewsItem> mDatas) {  this.mDatas.addAll(mDatas); } @Override public int getCount() {  return mDatas.size(); } @Override public Object getItem(int position) {  return mDatas.get(position); } @Override public long getItemId(int position) {  return position; } @Override public View getView(int position, View convertView, ViewGroup parent) {  ViewHolder holder = null;  if (convertView == null)  {   convertView = mInflater.inflate(R.layout.news_item_yidong, null);   holder = new ViewHolder();   holder.mContent = (TextView) convertView.findViewById(R.id.id_content);   holder.mTitle = (TextView) convertView.findViewById(R.id.id_title);   holder.mDate = (TextView) convertView.findViewById(R.id.id_date);   holder.mImg = (ImageView) convertView.findViewById(R.id.id_newsImg);   convertView.setTag(holder);  } else  {   holder = (ViewHolder) convertView.getTag();  }  NewsItem newsItem = mDatas.get(position);  holder.mTitle.setText(DataUtil.ToDBC(newsItem.getTitle()));  holder.mContent.setText(newsItem.getContent());  holder.mDate.setText(newsItem.getDate());  if (newsItem.getImgLink() != null)  {   holder.mImg.setVisibility(View.VISIBLE);   imageLoader.displayImage(newsItem.getImgLink(), holder.mImg, options);  } else  {   holder.mImg.setVisibility(View.GONE);  }  return convertView; } private final class ViewHolder {  TextView mTitle;  TextView mContent;  ImageView mImg;  TextView mDate; }}

对于Listview的每个Item的布局,这样的写法也很常见了,所以都不多说了,注意一点就行,这里对图片的加载用的是Github上的ImageLoader项目。

3、Frament的布局文件

<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" >    <me.maxwin.view.XListView        android:id="@+id/id_xlistView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:cacheColorHint="#00000000"        android:divider="@drawable/base_list_divider_drawable"        android:fadingEdge="none" >    </me.maxwin.view.XListView></RelativeLayout>

XlistView的Item的布局文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    android:paddingLeft="16dp"    android:paddingRight="16dp"    android:paddingTop="8dp"    android:paddingBottom="8dp"    >    <TextView         android:id="@+id/id_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginBottom="8dp"        android:textSize="18sp"        android:textColor="@color/black"        android:text="如何有效地在海外市场推广产品?"/><LinearLayout     android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"    android:baselineAligned="true"    ><ImageView         android:id="@+id/id_newsImg"        android:src="@drawable/images"        android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_marginRight="8dp"     android:visibility="visible"/>    <LinearLayout        android:layout_width="0dp"        android:layout_height="fill_parent"        android:layout_gravity="center_vertical"        android:layout_weight="1"        android:gravity="center_vertical"        android:orientation="vertical" >          <LinearLayout            android:layout_width="fill_parent"            android:layout_height="0dp"            android:layout_weight="1"            android:gravity="top" >            <TextView                android:id="@+id/id_content"                android:layout_width="fill_parent"                android:layout_height="wrap_content"                android:gravity="top"                android:maxLines="2"                android:text="3D打印机一直以来只能进行单向操作,任务一旦开始便无法反悔。不过最近一批研究生研发了一种新型打印机,让你在打印的同时,可以修改重塑之前的设计。让我们一起来看看这个神奇的设备究竟是怎样的吧。"                android:textColor="@color/nomalGray"                android:textSize="14sp"                 />                    </LinearLayout>        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:gravity="center_vertical" >            <TextView                android:id="@+id/id_date"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight="1"                android:gravity="center_vertical|right"                android:paddingTop="8dp"                android:singleLine="true"                android:text="13分钟前|11次阅读"                android:textSize="12sp"                android:textColor="@color/nomalGray" />            <TextView                android:id="@+id/id"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_weight="1"                android:paddingTop="16dp"                android:text="1"                android:gravity="right"                android:visibility="gone"                android:textColor="@color/nomalGray"                 />        </LinearLayout>    </LinearLayout></LinearLayout>   <!-- <TextView                android:id="@+id/availableNum"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:textColor="@color/nomalGray"                android:layout_alignParentBottom="true"                android:layout_alignParentRight="true"                android:background="@drawable/bg_mark_pressed"                android:text="可借:4"                android:textSize="13sp"                android:layout_marginLeft="2dp"                android:layout_marginRight="2dp"                android:layout_centerVertical="true"                 /> -->    </LinearLayout>

好了,到此结束,总体来说还是比较容易实现的,不过可以看到进展的感觉不错。

源码点击此处下载




           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值