activity_main
<?xml version="1.0" encoding="utf-8"?>
<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">
<RadioGroup
android:id="@+id/radio_group"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="40dp">
<RadioButton
android:id="@+id/radio_01"
android:padding="10dp"
android:button="@null"
android:gravity="center"
android:checked="true"
android:text="首页"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/radiobutton_selector"/>
<RadioButton
android:id="@+id/radio_02"
android:padding="10dp"
android:button="@null"
android:gravity="center"
android:text="想法"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/radiobutton_selector"/>
<RadioButton
android:id="@+id/radio_03"
android:padding="10dp"
android:button="@null"
android:gravity="center"
android:text="市场"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/radiobutton_selector"/>
<RadioButton
android:id="@+id/radio_04"
android:padding="10dp"
android:button="@null"
android:gravity="center"
android:text="通知"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/radiobutton_selector"/>
<RadioButton
android:id="@+id/radio_05"
android:padding="10dp"
android:button="@null"
android:gravity="center"
android:text="更多"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@drawable/radiobutton_selector"/>
</RadioGroup>
<FrameLayout
android:layout_above="@+id/radio_group"
android:id="@+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</RelativeLayout>
content
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<!--添加xlistview的组件 -->
<animtest.com.example.e531.week2_10month.view.XListView
android:id="@+id/xlv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</animtest.com.example.e531.week2_10month.view.XListView>
</LinearLayout>
item_pic
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_title"/>
<ImageView
android:layout_width="150dp"
android:layout_height="150dp"
android:scaleType="fitXY"
android:id="@+id/img"
android:layout_gravity="center"/>
</LinearLayout>
item_title
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv_title"/>
</LinearLayout>
layout_fragment_normal
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvv"
android:textSize="22sp"/>
</LinearLayout>
shouye_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:focusable="true">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!--tabLayout
修改 app:tabGravity="fill" app:tabMode="fixed",使选项卡可以平铺整个屏幕
-->
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="40dp"
app:tabGravity="fill"
app:tabIndicatorColor="@color/colorAccent"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorPrimaryDark"
app:tabTextColor="@color/colorPrimary"
android:id="@+id/tab"></android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vp"></android.support.v4.view.ViewPager>
</LinearLayout>
xlistview_footer
xlistview_header
radiobutton_selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时是红色-->
<item android:state_checked="true" android:drawable="@android:color/holo_red_dark"></item>
<item android:drawable="@android:color/white"></item>
</selector>
bean类Result
MyTask
package animtest.com.example.e531.week2_10month.Utils;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 使用AsyncTask+HttpURLConnection请求数据
* Created by e531 on 2017/10/12.
*/
public class MyTask extends AsyncTask<String,Void,String> {
//申请一个接口类对象
private Icallbacks icallbacks;
//将无参构造设置成私有的,使之在外部不能够调用
private MyTask(){}
//定义有参构造方法
public MyTask(Icallbacks icallbacks) {
this.icallbacks = icallbacks;
}
@Override
protected String doInBackground(String... params) {
String str="";
try {
//使用HttpUrlConnection
URL url=new URL(params[0]);
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
if(connection.getResponseCode()==200){
InputStream inputStream=connection.getInputStream();
//调用工具类中的静态方法
str=StreamToString.streamToStr(inputStream,"utf-8");
}
} catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
return str;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//解析,封装到bean,更新ui组件
icallbacks.updateUiByjson(s);
}
//定义一个接口
public interface Icallbacks{
/**
* 根据回传的json字符串,解析并更新页面组件
* @param jsonstr
*/
void updateUiByjson(String jsonstr);
}
}
StreamToString
package animtest.com.example.e531.week2_10month.Utils;
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; /** * Created by e531 on 2017/10/12. */ public class StreamToString { public static String streamToStr(InputStream inputStream, String chartSet){ StringBuilder builder=new StringBuilder(); try { BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,chartSet)); String con; while ((con=br.readLine())!=null){ builder.append(con); } br.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } }
MyApplication
package animtest.com.example.e531.week2_10month;
import android.app.Application;
import animtest.com.example.e531.week2_10month.Utils.ImageloaderUtil;
/**
* Created by e531 on 2017/10/17.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageloaderUtil.initConfig(this);
}
}
ImageloaderUtil
package animtest.com.example.e531.week2_10month.Utils; import android.content.Context; import android.graphics.Bitmap; import android.os.Environment; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import java.io.File; /** * */ public class ImageloaderUtil { /** * ImageLoader的配置 * @param context */ public static void initConfig(Context context) { //配置 // File cacheFile=context.getExternalCacheDir(); File cacheFile= new File(Environment.getExternalStorageDirectory()+"/"+"image"); ImageLoaderConfiguration config=new ImageLoaderConfiguration.Builder(context) .memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽 .threadPoolSize(2)//线程池的数量 .threadPriority(4) .memoryCacheSize(2*1024*1024)//设置内存缓存区大小 .diskCacheSize(20*1024*1024)//设置sd卡缓存区大小 .diskCache(new UnlimitedDiscCache(cacheFile))//自定义缓存目录 .writeDebugLogs()//打印日志内容 .diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理 .build(); ImageLoader.getInstance().init(config); } /** * 获取图片设置类 * @return */ public static DisplayImageOptions getImageOptions(){ DisplayImageOptions optionsoptions=new DisplayImageOptions.Builder() .cacheInMemory(true)//使用内存缓存 .cacheOnDisk(true)//使用磁盘缓存 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片格式 .displayer(new RoundedBitmapDisplayer(10))//设置圆角,参数代表弧度 .build(); return optionsoptions; }
}
NetStateUtil
package animtest.com.example.e531.week2_10month.Utils; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import animtest.com.example.e531.week2_10month.R; /** * 得到网络状态的工具类 * Created by e531 on 2017/10/16. */ public class NetStateUtil { /* * 判断网络连接是否已开 * true 已打开 false 未打开 * */ public static boolean isConn(Context context){ boolean bisConnFlag=false; ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo network = conManager.getActiveNetworkInfo(); if(network!=null){ bisConnFlag=conManager.getActiveNetworkInfo().isAvailable(); } return bisConnFlag; } /** * 当判断当前手机没有网络时选择是否打开网络设置 * @param context */ public static void showNoNetWorkDlg(final Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(R.mipmap.ic_launcher) // .setTitle(R.string.app_name) // .setMessage("当前无网络").setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 跳转到系统的网络设置界面 Intent intent = null; // 先判断当前系统版本 if(android.os.Build.VERSION.SDK_INT > 10){ // 3.0以上 intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); }else{ intent = new Intent(); intent.setClassName("com.android.settings", "com.android.settings.WirelessSettings"); } context.startActivity(intent); } }).setNegativeButton("知道了", null).show(); } }
导入
XListView
XListViewFooter
XListViewHeader
MyLvAdapter
package animtest.com.example.e531.week2_10month.adapter;
import android.content.Context;
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.ImageLoader;
import java.util.List;
import animtest.com.example.e531.week2_10month.R;
import animtest.com.example.e531.week2_10month.Utils.ImageloaderUtil;
import animtest.com.example.e531.week2_10month.bean.Result;
/**
* Created by e531 on 2017/10/17.
*/
public class MyLvAdapter extends BaseAdapter{
private List<Result.ResultsEntity> lists;
private Context context;
//定义视图类型
private final int TYPE_TITLE=0;
private final int TYPE_PIC=1;
public MyLvAdapter(List<Result.ResultsEntity> lists, Context context) {
this.lists = lists;
this.context = context;
}
@Override
public int getCount() {
return lists.size();
}
//返回视图类型的数量
@Override
public int getViewTypeCount() {
return 2;
}
//根据当前的条目的下标,返回此条目对应的视图类型
@Override
public int getItemViewType(int position) {
//根据数据去判断返回的类型
Result.ResultsEntity entity=lists.get(position);
List<String> imgurl=entity.getImages();
if(imgurl==null){
return TYPE_TITLE;
}else{
return TYPE_PIC;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//根据position得到视图类型
int type=getItemViewType(position);
if(type==TYPE_TITLE){
ViewHolderTitle holderTitle;
if(convertView==null){
holderTitle=new ViewHolderTitle();
convertView=View.inflate(context, R.layout.item_title,null);
holderTitle.textView=(TextView) convertView.findViewById(R.id.tv_title);
convertView.setTag(holderTitle);
}else{
holderTitle=(ViewHolderTitle) convertView.getTag();
}
holderTitle.textView.setText(lists.get(position).getDesc());
}else if(type==TYPE_PIC){
ViewHolderPic holderPic;
if(convertView==null){
holderPic=new ViewHolderPic();
convertView=View.inflate(context, R.layout.item_pic,null);
holderPic.textView=(TextView) convertView.findViewById(R.id.tv_title);
holderPic.imageView=(ImageView) convertView.findViewById(R.id.img);
convertView.setTag(holderPic);
}else{
holderPic=(ViewHolderPic) convertView.getTag();
}
holderPic.textView.setText(lists.get(position).getDesc());
//加载图片
ImageLoader.getInstance().displayImage(
lists.get(position).getImages().get(0),
holderPic.imageView,
ImageloaderUtil.getImageOptions());
}
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return lists.get(position);
}
class ViewHolderTitle{
TextView textView;
}
class ViewHolderPic{
TextView textView;
ImageView imageView;
}
}
MyPagerAdapter
package animtest.com.example.e531.week2_10month.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import java.util.List;
import animtest.com.example.e531.week2_10month.fragments.ContentFragment;
import animtest.com.example.e531.week2_10month.fragments.DongTaiFragment;
import animtest.com.example.e531.week2_10month.fragments.FindFragment;
/**
* Created by e531 on 2017/10/17.
*/
public class MyPagerAdapter extends FragmentPagerAdapter {
//选项卡文字列表
private List<String> tabs;
public MyPagerAdapter(FragmentManager fm,List<String> tabs) {
super(fm);
this.tabs=tabs;
}
//用于返回选项卡的文本
@Override
public CharSequence getPageTitle(int position) {
return tabs.get(position);
}
@Override
public Fragment getItem(int position) {
Fragment f=null;
switch (position){
case 0:
f=new DongTaiFragment();//动态页面
break;
case 1:
f=new ContentFragment();//热门页面
break;
case 2:
f=new FindFragment();//发现页面
break;
}
return f;
}
@Override
public int getCount() {
return tabs.size();
}
}
fragment
ContentFragment
package animtest.com.example.e531.week2_10month.fragments;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
import animtest.com.example.e531.week2_10month.R;
import animtest.com.example.e531.week2_10month.Utils.MyTask;
import animtest.com.example.e531.week2_10month.adapter.MyLvAdapter;
import animtest.com.example.e531.week2_10month.bean.Result;
import animtest.com.example.e531.week2_10month.view.XListView;
/**
* Created by e531 on 2017/10/17.
*/
public class ContentFragment extends Fragment {
private View v;
private int pageIndex=1;
private MyLvAdapter lvAdapter;
private List<Result.ResultsEntity> lists=new ArrayList<>();
private XListView xlv;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = View.inflate(getActivity(), R.layout.content,null);
xlv = (XListView) v.findViewById(R.id.xlv);
//进行设置
xlv.setPullRefreshEnable(true);
xlv.setPullLoadEnable(true);
//设置监听
xlv.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
pageIndex=1;
MyTask mytask=new MyTask(new MyTask.Icallbacks() {
@Override
public void updateUiByjson(String jsonstr) {
Gson gson=new Gson();
Result result=gson.fromJson(jsonstr, Result.class);
//要显示的数据-添加到最前面
lists.addAll(0,result.getResults());
//设置适配器
setAdapter();
//关闭视图
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
xlv.stopRefresh();
}
},1000);
}
});
mytask.execute("http://gank.io/api/data/Android/10/"+pageIndex);
}
@Override
public void onLoadMore() {
pageIndex++;
MyTask mytask=new MyTask(new MyTask.Icallbacks() {
@Override
public void updateUiByjson(String jsonstr) {
Gson gson=new Gson();
Result result=gson.fromJson(jsonstr, Result.class);
//要显示的数据
lists.addAll(result.getResults());
//设置适配器
setAdapter();
//关闭视图
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
xlv.stopLoadMore();
}
},1000);
}
});
mytask.execute("http://gank.io/api/data/Android/10/"+pageIndex);
}
});
return v;
}
public void setAdapter(){
if(lvAdapter==null){
lvAdapter=new MyLvAdapter(lists,getActivity());
xlv.setAdapter(lvAdapter);
}else{
lvAdapter.notifyDataSetChanged();
}
}
private void requestNetData() {
MyTask mytask=new MyTask(new MyTask.Icallbacks() {
@Override
public void updateUiByjson(String jsonstr) {
Gson gson=new Gson();
Result result=gson.fromJson(jsonstr, Result.class);
//要显示的数据
lists.addAll(result.getResults());
//设置适配器
setAdapter();
}
});
mytask.execute("http://gank.io/api/data/Android/10/"+pageIndex);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
requestNetData();
}
}
DongTaiFragment
FindFragment
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.layout_fragment_normal,null);
TextView textView=(TextView) v.findViewById(R.id.tvv);
textView.setText("动态");
return v;
}
ShouYeFragment
package animtest.com.example.e531.week2_10month.fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import animtest.com.example.e531.week2_10month.R;
import animtest.com.example.e531.week2_10month.adapter.MyPagerAdapter;
/**
* Created by e531 on 2017/10/16.
*/
public class ShouYeFragment extends Fragment{
private View v;
private TabLayout tab;
private ViewPager viewPager;
private List<String> tabs;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.shouye_layout,null);
initView();
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
tabs=new ArrayList<>();
tabs.add("动态");
tabs.add("热门");
tabs.add("发现");
//设置viewpager的适配器
viewPager.setAdapter(new MyPagerAdapter(getChildFragmentManager(),tabs));
//进行关联
tab.setupWithViewPager(viewPager);
}
private void initView() {
tab = (TabLayout) v.findViewById(R.id.tab);
viewPager = (ViewPager) v.findViewById(R.id.vp);
}
}
MainActivity
package animtest.com.example.e531.week2_10month;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.transition.Transition;
import android.widget.RadioGroup;
import android.widget.Toast;
import animtest.com.example.e531.week2_10month.fragments.GengDuoFragment;
import animtest.com.example.e531.week2_10month.fragments.ShiChangFragment;
import animtest.com.example.e531.week2_10month.fragments.ShouYeFragment;
import animtest.com.example.e531.week2_10month.fragments.TongZhiFragment;
import animtest.com.example.e531.week2_10month.fragments.XiangfaFragment;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RadioGroup radioGroup= (RadioGroup) findViewById(R.id.radio_group);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId){
case R.id.radio_01:
addFragment(new ShouYeFragment());
break;
case R.id.radio_02:
addFragment(new XiangfaFragment());
break;
case R.id.radio_03:
addFragment(new ShiChangFragment());
break;
case R.id.radio_04:
addFragment(new TongZhiFragment());
break;
case R.id.radio_05:
addFragment(new GengDuoFragment());
break;
default:
break;
}
}
});
//添加“首页”页面
addFragment(new ShouYeFragment());
}
public void addFragment(Fragment f){
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction = manager.beginTransaction();
fragmentTransaction.replace(R.id.frame_layout,f);
fragmentTransaction.commit();
}
}
注:清单文件里加入权限