转载请标明出处:http://blog.csdn.net/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 FragmentActivity
{
private 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 BaseAdapter
{
private 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>
好了,到此结束,总体来说还是比较容易实现的,不过可以看到进展的感觉不错。
分享到:
相关推荐
CSDN(China Software Developer Network)是一个知名的中国程序员社区,提供了丰富的技术资源和交流平台,而这个客户端则是CSDN在移动设备上的延伸。 项目描述中提到的博客地址提供了关于该项目的详细开发过程和...
它负责与CSDN的API进行交互,获取博客数据,如文章列表、文章详情等。通常,这样的客户端会实现网络请求(如使用HttpURLConnection或OkHttp)、JSON解析(如Gson或Jackson)以及UI展示(如使用RecyclerView显示博客...
通过这款客户端,用户可以在手机或平板电脑上随时随地浏览CSDN上的内容,提升学习和工作效率。 在这款客户端的开发过程中,涉及到了Android应用开发的多个核心知识点: 1. **用户界面设计**:使用Android Studio中...
Android 源码 毕业设计高仿今日头条新闻客户端 App 文章地址:https://blog.csdn.net/JasonXu94/article/details/128821784 现有功能: 1.获取各种频道的新闻列表,包括视频和非视频新闻; 2.查看新闻详情,包括视频和...
在处理用户数据或遍历文章列表时,可能会用到`for`循环或`while`循环。Python的`for`循环常与`range()`或迭代器一起使用,而`while`循环适用于条件判断更为复杂的场景。此外,Python还提供了`break`和`continue`语句...
【标题】"高仿网易新闻客户端主界面"指的是在Android或iOS平台上开发一个与网易新闻客户端主界面设计类似的移动应用界面。这个项目可能是为了学习和理解新闻客户端UI设计的实现,或者是开发者展示其UI设计和编程技能...
此外,提供了两个链接(http://blog.csdn.net/xiayaobo 和 http://download.csdn.net/my),这可能指向作者的个人博客或者在CSDN(中国最大的开发者社区)上的更多相关文章和下载资源,为学习者提供了进一步深入学习...
【描述】在CSDN博客上的一篇文章中,作者分享了如何从零开始构建这样一个客户端应用的详细过程。这个过程涵盖了Android应用开发的基础知识,包括: 1. **项目初始化**:使用Android Studio创建新项目,选择合适的...
参考链接中的博客文章《http://blog.csdn.net/hmg25/article/details/8100896》可能会提供更详细的实现步骤。 3. **文件结构**: 在`IncrementalUpdates`这个压缩包中,可能包含以下文件: - `diff.patch`:这是...
【描述】中的链接指向了一篇CSDN博客文章,该文章详细介绍了如何理解和使用这个源码。通过这篇文章,开发者可以学习到如何将Gank.io的数据接口与Android应用结合,实现数据的获取、解析以及在UI上的展示。文章可能...
2:宠物信息:列表显示发布的宠物想,可以通过条件对宠物信息进行筛选,以及沟通意向点亮 3:宠物圈:用户可以发布宠物的动态信息,其他用户可以浏览,还可以点赞和留言 4:活动信息:用户可以查看宠物线上活动信息...
由于提供的文件名称列表中只有"nextcloud"一项,这意味着压缩包内可能包含整个NextCloud的源代码目录结构,如`app`(应用程序)、`config`(配置文件)、`themes`(主题)、`3rdparty`(第三方库)等,用户需要按照...
【描述】:“家庭记账app例子,配合另一资源android lifecost app端源码和一篇博客一起工作” 这个项目不仅包含了Web端的源代码,还暗示了一个Android应用的源代码(可能在另一个压缩包中),以及一篇博客文章。这...
【标签】"swoole 聊天室 swoole+websocket"这三个标签强调了本项目的核心技术,即Swoole扩展和WebSocket协议,以及它们在实现聊天室功能上的结合。Swoole的异步非阻塞特性使得它能够高效处理大量并发连接,而...
要深入了解和实践BindService,你需要查看`app`目录下的代码,特别是`src/main/java`中的Service类和客户端Activity,以及如何在它们之间建立绑定关系。通过阅读和运行这个示例项目,你将更好地掌握Android中...
COMSOL提供一系列的资源和教程来帮助用户入门学习,例如视频中心、博客文章以及用户论坛,这些资源均可在COMSOL的官方网站上找到。 COMSOL软件的用户界面由多个组件构成,其中包括快速访问工具栏、功能区、模型开发...
【描述】中的链接指向的是CSDN博客的一篇文章,详细介绍了如何实现这个项目。文章可能涵盖了以下内容: 1. **项目结构**:介绍项目的模块划分,比如客户端APP模块、服务器API模块等。 2. **功能实现**:讲解如何实现...
【描述】:“博客链接:http://blog.csdn.net/qq20004604/article/details/52019904” 提供了一个详细的文章链接,该文章可能详细介绍了此微博网站源代码的实现过程、主要功能、技术选型以及使用方法。通过访问这个...