新闻展示例子(解析json+利用ViewPager+Fragment+actionbar实现左右滑动)
json:http://m2.qiushibaike.com/article/list/suggest?page=1&count=10
activity_main.xml
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout>
hot_layout.xml
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/hot_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="162dp" android:text="Hot" /> </RelativeLayout>
image_layout.xml
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="137dp" android:layout_marginTop="196dp" android:src="@drawable/ic_launcher" /> </RelativeLayout>
suggest_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/suggest_listView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="textFragment" /> </LinearLayout>
text_layout
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="100dp" android:layout_marginTop="80dp" android:text="TEXT" /> </RelativeLayout>
HotFragment.java
package com.example.fragment; import com.example.fq5.R; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class HotFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view= inflater.inflate(R.layout.hot_layout, null); return view; } }
ImageFragment.java
package com.example.fragment; import com.example.fq5.R; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ImageFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view= inflater.inflate(R.layout.image_layout, null); return view; } }
TextFragment.java
package com.example.fragment; import com.example.fq5.R; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TextFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view= inflater.inflate(R.layout.text_layout, null); return view; } }
MainActivity.java
package com.example.fq5; import com.example.fragment.HotFragment; import com.example.fragment.ImageFragment; import com.example.fragment.SuggestFragment; import com.example.fragment.TextFragment; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.ActionBar.TabListener; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Menu; public class MainActivity extends FragmentActivity { // 可滑动控件 ViewPager viewPager; // 碎片数组 Fragment[] fgt = new Fragment[4]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewPager); // 初始化碎片并添加数组中 fgt[0] = new SuggestFragment(); fgt[1] = new TextFragment(); fgt[2] = new ImageFragment(); fgt[3] = new HotFragment(); // 添加适配器显示 viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { // TODO Auto-generated method stub return fgt.length; } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return fgt[arg0]; } }); final ActionBar actionBar = getActionBar(); // 导航模式 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // 获取导肮文字数组 String[] tab_text = getResources().getStringArray(R.array.tab_text); // 根据fragment数量添加标签 for (int i = 0; i < fgt.length; i++) { actionBar.addTab(actionBar.newTab().setText(tab_text[i]).setTabListener(new TabListener() { // 未选中 @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } // 选中 @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub viewPager.setCurrentItem(tab.getPosition()); } // 重选 @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } })); viewPager.setOnPageChangeListener(new OnPageChangeListener() { // 滑动完毕 @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub getActionBar().setSelectedNavigationItem(arg0); } /* * arg0 当前页面 arg1 滑动比例 arg2 滑动像素 */ @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } // 滑动状态改变 /* * 0什么没做 1正在滑动 2滑动完毕 */ @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">FQ5</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string-array name="tab_text"> <item>推荐</item> <item>純文</item> <item>純图</item> <item>热门</item> </string-array> </resources>
-------------------------------------------------------------------------------
SuggestFragment.java
package com.example.fragment; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.example.adapter.SuggestAdapter; import com.example.bean.UserBean; import com.example.fq5.R; import com.example.utils.NetUtils; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.Toast; public class SuggestFragment extends Fragment { private ListView suggest_listView; private NetUtils netUtils = new NetUtils(); private SuggestAdapter adapter; Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { // 从message中得到list集合 List<UserBean> list = (List<UserBean>) msg.obj; // 初始化适配器 adapter = new SuggestAdapter(getActivity(), list, handler); // 添加到listView suggest_listView.setAdapter(adapter); Toast.makeText(getActivity(), "" + list.size(), 1).show(); }; }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 初始化布局 View view = inflater.inflate(R.layout.suggest_layout, null); suggest_listView = (ListView) view.findViewById(R.id.suggest_listView); new Thread() { @Override public void run() { // TODO Auto-generated method stub super.run(); String result = netUtils .getJsonString("http://m2.qiushibaike.com/article/list/suggest?page=1&count=10"); List<UserBean> list = parse(result); // 创建message对象 Message message = handler.obtainMessage(); message.obj = list; // 发送消息 handler.sendMessage(message); } }.start(); return view; } /* * Json解析 */ private List<UserBean> parse(String jsonString) { // 新建集合 List<UserBean> list = new ArrayList<UserBean>(); try { JSONObject object = new JSONObject(jsonString); JSONArray jsa = object.getJSONArray("items"); for (int i = 0; i < jsa.length(); i++) { UserBean bean = new UserBean(); // 根据下标获取其中一个对象 JSONObject userJson = jsa.getJSONObject(i); bean.setContent(userJson.getString("content")); bean.setComments_count(userJson.getInt("comments_count")); bean.setLogin(userJson.getJSONObject("user").getString("login")); bean.setId(userJson.getJSONObject("user").getInt("id")); bean.setIcon(userJson.getJSONObject("user").getString("icon")); bean.setUp(userJson.getJSONObject("votes").getInt("up")); bean.setDown(userJson.getJSONObject("votes").getInt("down")); list.add(bean); Log.i("response", bean.toString()); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } }
UserBean.java
package com.example.bean; import android.R.string; public class UserBean { private String login;//用户名 private int id; private int up;//支持 private int down;//不支持 private String content;//内容 private int comments_count;//评论数 private String icon;//头像 public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUp() { return up; } public void setUp(int up) { this.up = up; } public int getDown() { return down; } public void setDown(int down) { this.down = down; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getComments_count() { return comments_count; } public void setComments_count(int comments_count) { this.comments_count = comments_count; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } @Override public String toString() { return "UserBean [login=" + login + ", id=" + id + ", up=" + up + ", down=" + down + ", content=" + content + ", comments_count=" + comments_count + ", icon=" + icon + "]"; } }
NetUtils.java
package com.example.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; public class NetUtils { public String getJsonString(String path) { try { // 创建URL URL url = new URL(path); // 打开链接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方法 connection.setRequestMethod("GET"); // 设置请求超时时间 connection.setConnectTimeout(1000 * 10); connection.setReadTimeout(1000 * 10); // 获取响应码 200 400 int code = connection.getResponseCode(); if (code == 200) { // 得到输入流 InputStream is = connection.getInputStream(); // 定义缓冲区长度 int length = 0; // 缓冲区 byte[] data = new byte[1024]; // 定义字节输出流 ByteArrayOutputStream os = new ByteArrayOutputStream(); while ((length = is.read(data)) != -1) { // 写入到os对象中 os.write(data, 0, length); } byte[] byteArray = os.toByteArray(); // 转换String字符 String result = new String(byteArray); Log.e("response", result); return result; } else { Log.e("response", "请求失败"); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public Bitmap getImage(String path) { try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); Bitmap bitmap = BitmapFactory.decodeStream(connection.getInputStream()); return bitmap; } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
SuggestAdapter.java
package com.example.adapter; import java.util.List; import com.example.bean.UserBean; import com.example.fq5.R; import com.example.utils.NetUtils; import android.content.Context; import android.graphics.Bitmap; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class SuggestAdapter extends BaseAdapter { private Context context; private List<UserBean> list; private Handler handler; public SuggestAdapter(Context context, List<UserBean> list, Handler handler) { // TODO Auto-generated constructor stub this.context = context; this.list = list; this.handler = handler; } // public SuggestAdapter(Context context, List<UserBean> list) { // // TODO Auto-generated constructor stub // this.context = context; // this.list = list; // } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final Holder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.suggest_list_item, null); holder = new Holder(convertView); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } UserBean bean = list.get(position); // 设置文本信息 holder.login.setText(bean.getLogin()); holder.content.setText(bean.getContent()); holder.up.setText(bean.getUp() + ""); holder.down.setText(bean.getDown() + ""); holder.comments_count.setText(bean.getComments_count() + ""); // 拼接图片请求链接 String path = "http://pic.qiushibaike.com/system/avtnew/"; final StringBuffer sb = new StringBuffer(path); String id = bean.getId() + ""; sb.append(id.substring(0, id.length() - 4) + "/"); sb.append(id + "/medium/"); sb.append(bean.getIcon()); holder.icon.setTag(sb.toString()); new Thread() { @Override public void run() { // TODO Auto-generated method stub super.run(); final Bitmap bitmap = new NetUtils().getImage(sb.toString()); handler.post(new Runnable() { public void run() { if (holder.icon.getTag() != null && holder.icon.getTag().equals(sb.toString())) { holder.icon.setImageBitmap(bitmap); } } }); } }.start(); return convertView; } class Holder { private TextView login;// 用户名 private TextView content;// 内容 private ImageView icon;// 头像 private TextView up;// 支持 private TextView down;// 不支持 private TextView comments_count;// 评论数 public Holder(View view) { login = (TextView) view.findViewById(R.id.suggest_item_login); content = (TextView) view.findViewById(R.id.suggest_item_content); icon = (ImageView) view.findViewById(R.id.suggest_item_icon); up = (TextView) view.findViewById(R.id.suggest_item_fun_tv); down = (TextView) view.findViewById(R.id.suggest_item_unfun_tv); comments_count = (TextView) view.findViewById(R.id.suggest_item_comments_tv); } } }
suggest_list_item.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" android:padding="10dp" > <ImageView android:id="@+id/suggest_item_icon" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/ic_launcher" /> <!-- layout_alignTop——上对齐 --> <!-- layout_alignBottom——下对齐 --> <TextView android:id="@+id/suggest_item_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/suggest_item_icon" android:layout_alignTop="@id/suggest_item_icon" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/suggest_item_icon" android:gravity="center" android:text="百里公牛" /> <TextView android:id="@+id/suggest_item_content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/suggest_item_icon" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" android:text="我经常幻想我走在路上,被坏人捉走关到一个地下室里,每天给我一点菜叶子吃,让我不停的跑步,做俯卧撑,准备过一个月狠毒的杀死瘦弱的没有反抗能力的我。29天后,政府捉住了坏人,捣毁了组织,八十多斤的我被救了出来,政府还发给我一千万心灵损失费,于是我就这样变得又瘦又有钱啦" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/suggest_item_content" android:layout_below="@+id/suggest_item_content" > <ImageView android:id="@+id/suggest_item_up" android:layout_width="50dp" android:layout_height="50dp" android:src="@drawable/operation_support" /> <TextView android:id="@+id/suggest_item_fun_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_toRightOf="@id/suggest_item_up" android:text="好笑" /> <ImageView android:id="@+id/suggest_item_down" android:layout_width="50dp" android:layout_height="50dp" android:layout_toRightOf="@id/suggest_item_fun_tv" android:src="@drawable/operation_unsupport" /> <TextView android:id="@+id/suggest_item_unfun_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_toRightOf="@id/suggest_item_down" android:text="不好笑" /> <ImageView android:id="@+id/suggest_item_comments" android:layout_width="50dp" android:layout_height="50dp" android:layout_toRightOf="@id/suggest_item_unfun_tv" android:src="@drawable/operation_comments" /> <TextView android:id="@+id/suggest_item_comments_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_toRightOf="@id/suggest_item_comments" android:text="131评论" /> </RelativeLayout> </RelativeLayout>
-------------------------------------