新闻客户端
2015-09-07 16:08
411 查看
项目名称:新闻客户端
开发语言:java
开发环境:Eclipse、android SDK
项目简介:一款基于Android系统的新闻浏览软件,实现从网络获取新闻数据,下拉刷新,下拉加载更多,等功能
这里主要是实现上面的ViewPager和下面的ListView列表一起上下滚动的效果,使用的是第三方包ImageSlider_library,这里导入第三包的时候需要注意,必须勾选(copy project into
Workspace)这个选项,就是把你导入的第三包复制到和你当前的项目同一工作空间下面,这样才能找到,然后就是添加第三包了,右键你的项目选择,properties__Android__libary_add_apply_ok就行了,
这个页面效果布局也是一个Listview.只是上面的ViewPager是ListView设置的头HeadView,
首先要定义两个变量,他们的包就是你所导入的第三方包;
然后你需要新建一个xml,布局就是ListView的头部布局
这里引用的就是第三包的布局了
<com.scxh.slider.library.SliderLayout
然后就是把布局转换成View对象了
当然显示的内容肯定是要有个数据源,HashMap的数据和对象的数组都行,这里是从网络获取的
当我从网络取到数据的时候,从数据数组里面任意取几项放到一个新的数组里面,这个数据就是我这里的数据源
这样头部的设置就完成了,下面的LsitView就比较简单了,把从网络获取到所有数据取你需要显示的东西,添加到对象里面,再建一个动态数组List<对象>就是适配器的数据源了,再自定义适配器,然后ListView设置适配器就行了
这样这个界面就完成了;
在这里界面显示有个难点,就是ListView的单项布局有两种显示方式
二.下拉刷新,下拉加载更多
这里使用的是XListView的下拉刷新,上拉加载更多的效果
首先你还是需要导入第三方包XlistView;
这里需要改变的只是将你主布局XML里面的ListVIiew改成导入的第三包的XListView
侧滑切换功能的实现
首先你还是需要导入第三方包slidingmenu_library
然后新建一个你侧滑时候出现的Fragment
新闻列表点击内容的实现
主页Tab切换和滑动效果的嵌套实现
开发语言:java
开发环境:Eclipse、android SDK
项目简介:一款基于Android系统的新闻浏览软件,实现从网络获取新闻数据,下拉刷新,下拉加载更多,等功能
这里主要是实现上面的ViewPager和下面的ListView列表一起上下滚动的效果,使用的是第三方包ImageSlider_library,这里导入第三包的时候需要注意,必须勾选(copy project into
Workspace)这个选项,就是把你导入的第三包复制到和你当前的项目同一工作空间下面,这样才能找到,然后就是添加第三包了,右键你的项目选择,properties__Android__libary_add_apply_ok就行了,
这个页面效果布局也是一个Listview.只是上面的ViewPager是ListView设置的头HeadView,
private View mHeaderView; private SliderLayout mSliderLayout;
首先要定义两个变量,他们的包就是你所导入的第三方包;
然后你需要新建一个xml,布局就是ListView的头部布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <com.scxh.slider.library.SliderLayout android:id="@+id/my_slider" android:layout_width="match_parent" android:layout_height="200dp" custom:auto_cycle="true" custom:indicator_visibility="visible" custom:pager_animation="Accordion" custom:pager_animation_span="1100" /> <com.scxh.slider.library.Indicators.PagerIndicator android:id="@+id/custom_indicator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" android:gravity="center" custom:selected_color="#0095BF" custom:selected_height="6dp" custom:selected_padding_left="5dp" custom:selected_padding_right="5dp" custom:selected_width="6dp" custom:shape="oval" custom:unselected_color="#55333333" custom:unselected_height="6dp" custom:unselected_padding_left="5dp" custom:unselected_padding_right="5dp" custom:unselected_width="6dp" /> </RelativeLayout>
这里引用的就是第三包的布局了
<com.scxh.slider.library.SliderLayout
然后就是把布局转换成View对象了
mHeaderView = inflater.inflate( R.layout.fragment_imageslider_listview_headview, null); mSliderLayou=(SliderLayout)mHeaderView.findViewById(R.id.my_slider); 然后就是设置到ListView了 HashMap<String, String> http_url_maps = getData(); for (String name : http_url_maps.keySet()) { TextSliderView textSliderView= new TextSliderView(getActivity()); textSliderView.description(name).image(http_url_maps.get(name)) .setScaleType(BaseSliderView.ScaleType.Fit); mSliderLayout.addSlider(textSliderView); } mListView.addHeaderView(mHeaderView); MyBaseAdapter mAdapter = new MyBaseAdapter(getActivity()); mListView.setAdapter(mAdapter); mAdapter.setData(getDataContent());
当然显示的内容肯定是要有个数据源,HashMap的数据和对象的数组都行,这里是从网络获取的
当我从网络取到数据的时候,从数据数组里面任意取几项放到一个新的数组里面,这个数据就是我这里的数据源
ArrayList<ContentBean> imageList = new ArrayList<ContentBean>(); int count = 4; if (count > 0) { imageList.add(content); count--; } 这里表示我只取4项,然后添加到数组里面,作为数据源 setSliderImage(imageList); public void setSliderImage(ArrayList<ContentBean> imageList) { mSliderLayout.removeAllSliders(); for (ContentBean bean : imageList) { TextSliderView textSliderView = new TextSliderView(getActivity()); Log.v("tag", "bean.getImgsrc() >>> " + bean.getImgsrc()); textSliderView.description(bean.getTitle()).image(bean.getImgsrc()) .setScaleType(BaseSliderView.ScaleType.Fit); mSliderLayout.addSlider(textSliderView); } }
这样头部的设置就完成了,下面的LsitView就比较简单了,把从网络获取到所有数据取你需要显示的东西,添加到对象里面,再建一个动态数组List<对象>就是适配器的数据源了,再自定义适配器,然后ListView设置适配器就行了
这样这个界面就完成了;
在这里界面显示有个难点,就是ListView的单项布局有两种显示方式
List列表的两种显示方式的实现 这里首先你肯定需要两个XML,然后就是在自定义的适配器中多重写几个方法 private final static int TYPE_ONE = 0; // 类型序号必须从0开始 private final static int TYPE_TWO = 1; private final static int TYPE_COUNT = 2; // listview类型个数 @Override public int getViewTypeCount() { return TYPE_COUNT; } @Override public int getItemViewType(int position) { ContentBean typeBean = (ContentBean) getItem(position); ArrayList<String> imageArray = typeBean.getImgextra(); if (imageArray != null) { return TYPE_ONE; } else { return TYPE_TWO; } } 这个方法是需要你传的数据过来,判断你去加载哪种布局 public View getTypeOneView(int position, View convertView, ViewGroup parent) { 加载第一种布局 public View getTypeOneView(int position, View convertView, ViewGroup parent) { 加载第二种布局 @Override public View getView(int position, View convertView, ViewGroup parent) { if (getItemViewType(position) == TYPE_ONE) { return getTypeOneView(position, convertView, parent); } else { return getTwoTypeView(position, convertView, parent); } } 调用getItemViewType决定调用哪个方法去加载那种布局 这样这个界面就完成了;
二.下拉刷新,下拉加载更多
这里使用的是XListView的下拉刷新,上拉加载更多的效果
首先你还是需要导入第三方包XlistView;
这里需要改变的只是将你主布局XML里面的ListVIiew改成导入的第三包的XListView
<com.example.pressclient.XListView android:id="@+id/imagerslider_listview" android:layout_width="match_parent" android:layout_height="match_parent" > </com.example.pressclient.XListView>
使用就是在使用的类里面实现IXListViewListener接口,并实现里面的两个方法 @Override public void onRefresh() { //刷新 } @Override public void onLoadMore() { //加载更多 } }
<p><span style="color:#000000;">在方法里面写需要实现的功能就行了;</span></p>
在这里也有一个难点,就是当加载更多的时候List列表显示的数据问题,我们希望实现数据累加的,而不是只是显示一页,的数据,这也需要在自定义适配器里面重写,两个方法 public void setAdapterData(ArrayList<ContentBean> list) { this.list = list; notifyDataSetChanged(); } 当第一页的时候直接设置 public void addAdapterData(ArrayList<ContentBean> list) { this.list.addAll(list); notifyDataSetChanged(); } 当不是第一页的时候就累加list数据源
侧滑切换功能的实现
首先你还是需要导入第三方包slidingmenu_library
然后新建一个你侧滑时候出现的Fragment
package com.example.pressclient; import java.util.ArrayList; import java.util.HashMap; import java.util.List; 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.ListView; import android.widget.SimpleAdapter; public class SlidingmenuFragment extends Fragment { private ListView mListView; public static SlidingmenuFragment newInstance() { return new SlidingmenuFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.slidingmenu_menu_layout, container, false); mListView = (ListView) view.findViewById(R.id.slidingmenu_list); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); GetData(); String[] from = { "icon", "text" }; int[] to = { R.id.sm_list_item_icon, R.id.sm_list_item_text }; SimpleAdapter adapter = new SimpleAdapter(getActivity(), GetData(), R.layout.slidingmenu_list_item, from, to); mListView.setAdapter(adapter); } private List<HashMap<String, Object>> GetData() { List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> item = new HashMap<String, Object>(); item.put("icon", R.drawable.sliding_navigation_tab_pics); item.put("text", "图片"); list.add(item); item = new HashMap<String, Object>(); item.put("icon", R.drawable.sliding_navigation_tab_video); item.put("text", "视频"); list.add(item); item = new HashMap<String, Object>(); item.put("icon", R.drawable.sliding_navigation_tab_weather); item.put("text", "天气"); list.add(item); item = new HashMap<String, Object>(); item.put("icon", R.drawable.sliding_navigation_tab_map_1); item.put("text", "地图"); list.add(item); item = new HashMap<String, Object>(); item.put("icon", R.drawable.sliding_navigation_tab_more); item.put("text", "更多"); list.add(item); return list; } }
然后就是在主Activity里面引用这个Fragment了 private void setBehindContentView() { setBehindContentView(R.layout.slidingmenu_item_layout); getSupportFragmentManager() .beginTransaction() .add(R.id.slidingmenu_item_layout, SlidingmenuFragment.newInstance()).commit(); SlidingMenu sm = getSlidingMenu(); sm.setSlidingEnabled(true); sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN); sm.setShadowWidthRes(R.dimen.shadow_width); sm.setBehindOffsetRes(R.dimen.slidingmenu_offset); sm.setBehindScrollScale(0); sm.setFadeDegree(0.25f); } 这样侧滑就实现了
新闻列表点击内容的实现
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(getActivity(), ContentActivity.class); ContentBean content = (ContentBean) parent.getAdapter().getItem( position); String docid = content.getDocid(); intent.putExtra("docid", docid); startActivity(intent);
package com.example.pressclient; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.example.pressclient.ConnectionUtils.CallConnectionInterface; import com.example.pressclient.ConnectionUtils.Method; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.webkit.WebView; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; public class ContentActivity extends Activity implements OnClickListener{ private WebView mWebView; private TextView mTitle, mSource, mTime, mPicNumber; private ImageView mImageView; private String docid = "A90HHI6I00014SEH";// 新闻ID ,从新闻列表项目获取 private String url; private ProgressBar mProgressBar; private ConnectionUtils connectionUtils; private AsyncLoaderImage asyncLoaderImage; private ImageView mBackBtn; private static final int HANDLER_ERROR = 1; private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case HANDLER_ERROR: String errorResponse = (String) msg.obj; Toast.makeText(ContentActivity.this, errorResponse, Toast.LENGTH_SHORT) .show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.list_item_content); mWebView = (WebView) findViewById(R.id.ContentWebView); mTitle = (TextView) findViewById(R.id.content_title); mSource = (TextView) findViewById(R.id.content_source_text); mTime = (TextView) findViewById(R.id.content_time); mImageView = (ImageView) findViewById(R.id.content_image); mPicNumber = (TextView) findViewById(R.id.pic_number); mProgressBar=(ProgressBar) findViewById(R.id.content_progress); mBackBtn=(ImageView) findViewById(R.id.back_btn); mBackBtn.setOnClickListener(this); mImageView.setVisibility(View.GONE); connectionUtils = new ConnectionUtils(); asyncLoaderImage = AsyncLoaderImage.getInstanceAsyncLoaderImage(); GetData(); } private void GetData() { Intent intent = getIntent(); docid = intent.getStringExtra("docid"); url = "http://c.m.163.com/nc/article/" + docid + "/" + "full.html"; connectionUtils.asyncTaskConnection(url, Method.GET, new CallConnectionInterface() { @Override public void onExecuteResponse(String response) { try { mProgressBar.setVisibility(View.VISIBLE); JSONObject jsonObject = new JSONObject(response); JSONObject bodyObj = jsonObject .getJSONObject(docid); String body = bodyObj.getString("body"); final String title = bodyObj.getString("title"); String source = bodyObj.getString("source"); String ptime = bodyObj.getString("ptime"); mTitle.setText(title); mSource.setText("来源:" + source); mTime.setText(ptime); mWebView.loadDataWithBaseURL(null, body, "text/html", "utf-8", null); if (bodyObj.has("img")) { final ArrayList<String> imageUrls = new ArrayList<String>(); JSONArray imageArray = bodyObj .getJSONArray("img"); for (int i = 0; i < imageArray.length(); i++) { JSONObject obj = imageArray .getJSONObject(i); String imagrUrl = obj.getString("src"); imageUrls.add(imagrUrl); } Log.e("TAG", "imageUrls======"+imageUrls); if (imageUrls != null&& imageArray.length() > 0) { Log.e("TAG", "imageUrls======"+imageUrls); mImageView.setVisibility(View.VISIBLE); int count = imageArray.length(); mPicNumber.setText("共" + count + "张"); String url = imageUrls.get(0); asyncLoaderImage.loadBitmap(getResources(), url, mImageView); mImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ContentActivity.this, HttpImagevViewPager.class); intent.putExtra("imageUrls",imageUrls); intent.putExtra("title", title); startActivity(intent); } }); } } else { mImageView.setVisibility(View.GONE); } } catch (JSONException e) { e.printStackTrace(); } mProgressBar.setVisibility(View.GONE); } @Override public void onErrorResponse(String errorResponse) { Message msg = Message.obtain(); msg.what = HANDLER_ERROR; msg.obj = errorResponse; mHandler.sendMessage(msg); } }); } public Bitmap getBitmapByHttp(String httpUrl) { InputStream ins = null; try { URL url = new URL(httpUrl); ins = url.openStream(); Bitmap bitmap = BitmapFactory.decodeStream(ins); return bitmap; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (ins != null) { try { ins.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.back_btn: // Intent intent=new Intent(this, MainActivity.class); // startActivity(intent); this.finish(); System.exit(0); break; default: break; } } }
主页Tab切换和滑动效果的嵌套实现
mRadioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.HeadlineTab: mViewPager.setCurrentItem(0); break; case R.id.RecreationTab: mViewPager.setCurrentItem(1); break; case R.id.SportsTab: mViewPager.setCurrentItem(2); break; case R.id.FinanceTab: mViewPager.setCurrentItem(3); break; case R.id.ScienceTab: mViewPager.setCurrentItem(4); break; } } }); mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { switch (arg0) { case 0: mHeadlineTab.setChecked(true); break; case 1: mRecreationTab.setChecked(true); break; case 2: mSportsTab.setChecked(true); break; case 3: mFinanceTab.setChecked(true); break; case 4: mScienceTab.setChecked(true); break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); }
相关文章推荐
- Linux 检索
- 如何理解Hibernate中的HibernateSessionFactory类
- android:ellipsize="end" 失效或者 相关的Bug
- php图片水印添加,压缩,剪切的封装类实现
- HTML5移动端数据图表组件调研
- BZOJ 2038 小Z的袜子(hose)
- java-使用正则表达式截取字符串中的时间信息
- R图片保存到PDF文件中顺利显示中文的方法
- 网站的安全架构
- 黑马程序员——Objective-C Foundation框架中的NSString对象
- 编程1
- 保存URL返回的文件
- zepto 获取checked selected元素
- Android笔记(二十二) Android中的GridView
- matlab知识点汇集
- 编译libnl-3.2.25
- Release Notes for Contrail Release 2.20
- hdu4415 贪心好题
- Copy List with Random Pointer
- [Centos]官方repo安装Mysql