侧拉+TabLayout+轮播+XListView
来源:互联网 发布:浙江大数据交易中心 编辑:程序博客网 时间:2024/06/05 20:30
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>
<?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>
清单文件
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); }}
阅读全文
0 0
- 侧拉+TabLayout+轮播+XListView
- 侧拉 横向滑动tablayout 无限轮播
- 侧拉+pullToRefresh+无限轮播+tabLayout+fragment
- 综合(侧拉+TabLayout+ListView+t跳转+轮播+GridView)
- 轮播和Xlistview
- 无限轮播+XListView
- 轮播+跳转+xlistview
- 侧拉+xlistview+多条目展示+请求数据+tablayout+viewpager+Imageloder
- TabLayout+XlistView
- Tablayout与Viewpager里添加Xlistview实现上拉下拉
- XlistView的上拉刷新下拉加载 和Fragment 和无限轮播
- XlistView上拉刷新下拉加载+轮播+添加头布局
- viewpager+handler轮播;xlistview上下拉刷新;webView显示一个网页
- 侧滑,无线轮播,Xlistview
- xlistview+banner无限轮播
- 侧拉+轮播+刷新
- DrawerLayout侧拉+TabLayout
- 略仿今日头条部分功能,只供参考,娱乐而已(图片3秒跳转,无限轮播,webview,tablayout,listview,Xlistview)
- Spring的@Autowired如何自动装配在bean配置文件中声明的两个类似的bean呢?
- protoc3.5报文件不存在
- C 语言对于存储区域及指针的概念总结
- Laravel入门教程(七)- 表单Controller
- 统计某个字段中各个字符出现的次数
- 侧拉+TabLayout+轮播+XListView
- sqlite 的 limit
- linux 安装redis4.0.2
- Gradle插件开发 APK瘦身资源自定义7z压缩
- Face Model Compression by Distilling Knowledge from Neurons 论文理解
- 排序
- javax.net.ssl.SSLKeyException: RSA premaster secret error
- 注解的处理器映射器和适配器配置
- 数据结构上机——图(第一次)