drawable文件夹下
rb_selecter
<?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/holo_blue_dark"></item> </selector>
主布局文件夹下添加view文件夹
在strings.xml里添加
<string name="hello">Hello World, XListViewActivity!</string><string name="xlistview_header_hint_normal">下拉刷新</string>
<string name="xlistview_header_hint_ready">松开刷新数据</string>
<string name="xlistview_header_hint_loading">正在加载...</string>
<string name="xlistview_header_last_time">上次更新时间:</string>
<string name="xlistview_footer_hint_normal">查看更多</string>
<string name="xlistview_footer_hint_ready">松开载入更多</string>
清单文件
compile 'com.android.support:design:26.0.0-alpha1' compile files('libs/universal-image-loader-1.9.3-with-sources.jar') compile files('libs/gson-2.2.4.jar')
xml
activity_main
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/drawer"> <!--主内容布局--> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:id="@+id/rel_navigate" android:layout_alignParentBottom="true"> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="首页" android:button="@null" android:gravity="center" android:id="@+id/rb_index" android:padding="3dp" android:background="@drawable/rb_selector" android:checked="true"/> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="发现" android:button="@null" android:padding="3dp" android:gravity="center" android:id="@+id/rb_discovery" android:background="@drawable/rb_selector"/> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="下载" android:button="@null" android:gravity="center" android:padding="3dp" android:id="@+id/rb_down" android:background="@drawable/rb_selector"/> <RadioButton android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="我的" android:padding="3dp" android:button="@null" android:gravity="center" android:id="@+id/rb_me" android:background="@drawable/rb_selector"/> </RadioGroup> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/rel_navigate" android:id="@+id/main_content"></FrameLayout> </RelativeLayout> <!--菜单内容布局--> <LinearLayout android:layout_width="260dp" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/menu" android:layout_gravity="start" android:background="#440000ff"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" android:id="@+id/img"/> </LinearLayout> </android.support.v4.widget.DrawerLayout>
myindex
<?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"> <!--TabLayout+ViewPager--> <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/mytab" > </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>
tuijian
<?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.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/vp"></android.support.v4.view.ViewPager> <com.example.zonghelianxi.view.XListView android:id="@+id/xlv" android:layout_height="match_parent" android:layout_width="match_parent"></com.example.zonghelianxi.view.XListView> </LinearLayout>
index
<?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="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv" android:text="首页"/> </LinearLayout>
xlistview_header
<?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:gravity="bottom" > <RelativeLayout android:id="@+id/xlistview_header_content" android:layout_width="fill_parent" android:layout_height="60dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:orientation="vertical" android:id="@+id/xlistview_header_text"> <TextView android:id="@+id/xlistview_header_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/xlistview_header_hint_normal" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="3dp" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/xlistview_header_last_time" android:textSize="12sp" /> <TextView android:id="@+id/xlistview_header_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/xlistview_header_arrow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/xlistview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-35dp" android:src="@drawable/xlistview_arrow" /> <ProgressBar android:id="@+id/xlistview_header_progressbar" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignLeft="@id/xlistview_header_text" android:layout_centerVertical="true" android:layout_marginLeft="-40dp" android:visibility="invisible" /> </RelativeLayout> </LinearLayout>
xlistview_footer
<?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" > <RelativeLayout android:id="@+id/xlistview_footer_content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp" > <ProgressBar android:id="@+id/xlistview_footer_progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="invisible" /> <TextView android:id="@+id/xlistview_footer_hint_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/xlistview_footer_hint_normal" /> </RelativeLayout> </LinearLayout>
MainActivity
import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RadioGroup; public class MainActivity extends AppCompatActivity { private DrawerLayout drawerLayout; private LinearLayout linearLayout; private RadioGroup radioGroup; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = (DrawerLayout) findViewById(R.id.drawer); linearLayout = (LinearLayout) findViewById(R.id.menu); ImageView imageView= (ImageView) findViewById(R.id.img); radioGroup = (RadioGroup) findViewById(R.id.rel_navigate); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //关闭侧滑菜单 drawerLayout.closeDrawer(linearLayout); } }); //添加事件 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId){ case R.id.rb_index: //动态添加fragment getSupportFragmentManager().beginTransaction().replace(R.id.main_content,new IndexFragment()).commit(); break; case R.id.rb_discovery: addContentFragment("发现"); break; case R.id.rb_down: addContentFragment("下载"); break; case R.id.rb_me: addContentFragment("我的"); break; } } }); //首次添加indexfragment getSupportFragmentManager().beginTransaction().replace(R.id.main_content,new IndexFragment()).commit(); } public void addContentFragment(String str){ Bundle bundle=new Bundle(); bundle.putString("key",str); ContentFragment contentFragment=new ContentFragment(); contentFragment.setArguments(bundle); //动态添加fragment getSupportFragmentManager().beginTransaction().replace(R.id.main_content,contentFragment).commit(); } }
ContentFragment
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class ContentFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v=inflater.inflate(R.layout.index,container,false); TextView textView= (TextView) v.findViewById(R.id.tv); Bundle bundle=getArguments(); textView.setText(bundle.getString("key")); return v; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
IndexFragment
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 java.util.ArrayList; import java.util.List; public class IndexFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v=inflater.inflate(R.layout.myindex,container,false); TabLayout tabLayout= (TabLayout) v.findViewById(R.id.mytab); ViewPager viewPager= (ViewPager) v.findViewById(R.id.vp); List<String> tabs=new ArrayList<>(); tabs.add("推荐"); tabs.add("课程"); tabs.add("实战"); tabs.add("职业路径"); //设置适配器 getChildFragmentManager:在子fragment中获取 fragment的管理类对象 viewPager.setAdapter(new MyPagerAdapter(getChildFragmentManager(),tabs)); //tabLayout与viewPager创建关联 tabLayout.setupWithViewPager(viewPager); // viewPager.setOffscreenPageLimit(tabs.size()); return v; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } }
TuijianFragment
import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.example.zonghelianxi.view.XListView; import com.google.gson.Gson; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class TuijianFragment extends Fragment { private ViewPager viewPager; private XListView xListView; private ImageView[] img; private List<Result.DataScrollEntity> viewpagerDatas=new ArrayList<>(); private MyAdapter adapter; private int type=1; private int pageIndex=1; private String url="http://www.93.gov.cn/93app/data.do?channelId=0&startNum=0"; Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { int index=viewPager.getCurrentItem(); viewPager.setCurrentItem(index+1); sendEmptyMessageDelayed(1,2000); } }; private List<Result.DataEntity> listviewDatas; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tuijian, container, false); viewPager = (ViewPager) v.findViewById(R.id.vp); xListView = (XListView) v.findViewById(R.id.xlv); return v; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //调用网络请求工具类,获取数据 MyNetTask myNetTask=new MyNetTask(new MyNetTask.Icallbacks() { @Override public void getNetdata(String jsonstr) { //gson Gson gson=new Gson(); Result result=gson.fromJson(jsonstr, Result.class); //listview要显示的数据 listviewDatas = result.getData(); //轮播图要显示的数据 viewpagerDatas = result.getDataScroll(); //为viewpager设置适配器 viewPager.setAdapter(new MyLunBoAdapter(getActivity(), viewpagerDatas)); viewPager.setCurrentItem(viewpagerDatas.size()*100); img = new ImageView[viewpagerDatas.size()]; handler.sendEmptyMessageDelayed(1,2000); //设置支持下拉刷新 xListView.setPullRefreshEnable(true); //设置支持上拉加载更多 xListView.setPullLoadEnable(true); xListView.setXListViewListener(new XListView.IXListViewListener() { //刷新回调的接口 @Override public void onRefresh() { type=1; //重新请求第一页的数据 10条数据 pageIndex=1; String url="http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex; new MyTask().execute(url); } //加载更多回调的接口 @Override public void onLoadMore() { type=2; pageIndex++; //进行地址的拼接 String url="http://www.93.gov.cn/93app/data.do?channelId=0&startNum="+pageIndex; //执行异步请求 new MyTask().execute(url); } }); new MyTask().execute(url); } }); myNetTask.execute("http://www.93.gov.cn/93app/data.do?channelId=0&startNum=0"); } class MyTask extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... params) { String result = ""; try { URL url = new URL(params[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(20000); connection.setReadTimeout(20000); if(connection.getResponseCode()==200){ InputStream inputStream=connection.getInputStream(); result=StreamToString.streamToStr(inputStream,"utf-8"); } } catch (Exception e) { e.printStackTrace(); Log.e("zzz",e.getMessage().toString()); } return result; } @Override protected void onPostExecute(String s) { Log.d("zzz","data:"+s); //解析 Gson gson=new Gson(); Result result=gson.fromJson(s,Result.class); if(type==1){//代表刷新 //如果是刷新的话 listviewDatas.clear();//清除原有的数据 listviewDatas.addAll(result.getData());//添加新的数据 setAdapter(); //关闭xlistview的头部视图--延迟关闭 new Handler().postDelayed(new Runnable() { @Override public void run() { xListView.stopRefresh();//关闭 Date date=new Date(System.currentTimeMillis()); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s=sdf.format(date); xListView.setRefreshTime(s);//设置刷新时间 } },1000); }else if(type==2){//代表加载更多 //得到数据 listviewDatas.addAll(result.getData());//datas.addAll(0,result.getData());//将新请求的数据添加到集合的最前面 //设置适配器 setAdapter(); //关闭xlistview的底部视图--延迟关闭 new Handler().postDelayed(new Runnable() { @Override public void run() { xListView.stopLoadMore(); } },1000); }else{ } } } public void setAdapter() { if(adapter==null){ adapter=new MyAdapter(listviewDatas,getActivity()); xListView.setAdapter(adapter); }else{ adapter.notifyDataSetChanged(); } } }
MyNetTask
import android.os.AsyncTask; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MyNetTask extends AsyncTask<String,Void,String> { //1.初使化一个接口对象 private Icallbacks icallbacks; public MyNetTask(Icallbacks icallbacks) { //2.实例化对象 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); //3.调用接口中定义的方法 icallbacks.getNetdata(s); } public interface Icallbacks { void getNetdata(String jsonstr); } }
ImageUtils
import android.content.Context; import android.graphics.Bitmap; 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.assist.ImageScaleType; import java.io.File; public class ImageUtils { /** * 对ImageLoader进行初使化 * @param context */ public static void initImageLoader(Context context){ File cacheFile=context.getExternalCacheDir();//android认为的缓存目录 ImageLoaderConfiguration configuration=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(configuration); } /** * 得到图片的显示设置类 * @return */ public static DisplayImageOptions getImageOptions(){ DisplayImageOptions options=new DisplayImageOptions.Builder() .cacheInMemory(true)//使用内存缓存 .cacheOnDisk(true)//使用磁盘缓存 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的色彩模式 .imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放方式 .build(); return options; } }MyPagerAdapter
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import java.util.List; public class MyPagerAdapter extends FragmentPagerAdapter { private List<String> tabs;//选项卡列表 //得到页面的标题,选项卡,返回的数据,tabLayout的选项卡 @Override public CharSequence getPageTitle(int position) { return tabs.get(position); } public MyPagerAdapter(FragmentManager fm,List<String> tabs) { super(fm); this.tabs=tabs; } @Override public Fragment getItem(int position) { TuijianFragment tuijianFragment=new TuijianFragment(); if(position==1){ } return tuijianFragment; } @Override public int getCount() { return tabs.size(); } }MyAdapter
import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.List; public class MyAdapter extends BaseAdapter{ private List<Result.DataEntity> datas; private Context context; public MyAdapter(List<Result.DataEntity> datas, Context context) { this.datas = datas; this.context = context; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv=new TextView(context); tv.setText(datas.get(position).getTITLE()); return tv; } }MyApplication
import android.app.Application; public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); //进行初使化 ImageUtils.initImageLoader(this); } }StreamToString
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; 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 ""; } }MyLunBoAdapter
import android.content.Context; import android.support.v4.view.PagerAdapter; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; public class MyLunBoAdapter extends PagerAdapter{ private Context context; //用于存放网络图片的url地址 private List<Result.DataScrollEntity> imgUrl; public MyLunBoAdapter(Context context, List<Result.DataScrollEntity> imgUrl) { this.context = context; this.imgUrl=imgUrl; } //返回页面的数量 @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } //0~getCount返回的值-1 @Override public Object instantiateItem(ViewGroup container, int position) { //返回当前显示的视图 ImageView imageView = new ImageView(context); //图片的绽放方式 imageView.setScaleType(ImageView.ScaleType.FIT_XY); //取得图片的网络路径 imgUrl.size 5 String path=imgUrl.get((position%imgUrl.size())).getIMAGEURL(); Log.d("zzz","path:"+path); //使用ImageLoader下载图片 注意:需要拼接路径 ImageLoader.getInstance().displayImage("http://www.93.gov.cn/"+path, imageView, ImageUtils.getImageOptions()); //添加到容器 container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }