第一步:导入依赖
implementation ‘com.android.support:design:28.0.0’
implementation ‘com.github.userswlwork:pull-to-refresh:1.0.0’
implementation ‘com.google.code.gson:gson:2.8.5’
implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’(图片的)
写入权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
开始写代码:
步骤随意:
网络判断:
//简单的网络判断
public static boolean isCon(Context context){
boolean isf = false;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo!=null){
isf=true;
}
return isf;
}
图片加载(一样也是简单的):也可以写复杂的
//第一步先写继承:Application
public class MyAPP extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration build = new ImageLoaderConfiguration.Builder(this).build();
ImageLoader instance = ImageLoader.getInstance();
instance.init(build);
}
}
记得在清单文件中写入:android:name=".MyAPP"(.app是名称)
网路解析(本人之前也写过可以看看) :这是简单的:
public static String getJson(String urlString){
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
int responseCode = urlConnection.getResponseCode();
//网络请求成功
if (responseCode == 200) {
InputStream inputStream = urlConnection.getInputStream();
BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream));
String ss="";
StringBuffer stringBuffer = new StringBuffer();
while ((ss=buffer.readLine())!=null){
stringBuffer.append(ss);
}
Log.e("gs","接口请求成功-------"+stringBuffer.toString());
return stringBuffer.toString();
}
Log.e("gs","接口请求失败-------"+responseCode);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
//viewpager的代码就不写了(懒)
//开始写tablayout的调用
//布局
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frag01_tab"
/>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/frag01_page"
/>
代码:
//list集合
List<Fragment> fragmentList =new ArrayList<>();
List<String> titielist = new ArrayList<>();
//获取资源id
viewPager = view.findViewById(R.id.frag01_page);
tabLayout = view.findViewById(R.id.frag01_tab);
//关联:一定要关联
tabLayout.setupWithViewPager(viewPager);
写入数据和fragment
String[] titles = new String[]{"推荐","音乐","影视","不知"};
for (int i = 0; i <titles.length ; i++) {
titielist.add(titles[i]);
}
fragmentList.add(new TabFrag01());
fragmentList.add(new TabFrag02());
fragmentList.add(new TabFrag03());
fragmentList.add(new TabFrag04());
//调用适配器:getChildFragmentManager(),记住是getchild....
MyFragAdapter adapter = new MyFragAdapter(getChildFragmentManager(),fragmentList,titielist);
viewPager.setAdapter(adapter);
//适配器的代码:不过多解释了
//继承的是FragmentPagerAdapter
public class MyFragAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
private List<String> titielist;
public MyFragAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titielist) {
super(fm);
this.fragmentList = fragmentList;
this.titielist = titielist;
}
@Override
public Fragment getItem(int i) {
return fragmentList.get(i);
}
@Override
public int getCount() {
return titielist.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titielist.get(position);
}
开始写PullToRefreshListView:
布局:
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/tab01_plv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
数据库的代码就不写了哈:直接开始写PullToRefreshListView
适配器也简单不解释了
//适配器
public class MyTabAdapter extends BaseAdapter {
private Context context;
private List<JsonBean.NewslistBean> list;
public MyTabAdapter(Context context, List<JsonBean.NewslistBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.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) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(context,R.layout.tablistview,null);
holder.image = convertView.findViewById(R.id.tablv_imageView);
holder.tv1 =convertView.findViewById(R.id.tablv_textView);
holder.tv2 = convertView.findViewById(R.id.tablv_textView2);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv1.setText(list.get(position).getTitle());
holder.tv2.setText(list.get(position).getCtime());
Glide.with(context).load(list.get(position).getPicUrl()).into(holder.image);
// ImageLoader.getInstance().displayImage(list.get(position).getPicUrl(),holder.image);
return convertView;
}
//优化寄存器
class ViewHolder{
ImageView image;
TextView tv1,tv2;
}
}
List<JsonBean.NewslistBean> list = new ArrayList<>();
MyTabAdapter adapter;
int page = 0;
//资源id
plv = view.findViewById(R.id.tab01_plv);
//允许上下拉
plv.setMode(PullToRefreshBase.Mode.BOTH);
//数据库的调用
dao = new MyDao(getActivity());
// 适配器
adapter = new MyTabAdapter(getActivity(), list);
plv.setAdapter(adapter);
getNetData(page);
return view;
}
//url字段的拼接
private void getNetData(int page) {
zon = (urlString+page);
Log.e("gs","zon---------"+zon);'
initData();
}
private void initData() {
//判断是否有网
if (IntenetIF.isCon(getActivity())){
Log.e("gs","有网");
//上下来刷新
plv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
page=0;
list.clear();
// Log.e("gs","url-------"+getNetData(page));
getNetData(page);
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
page++;
getNetData(page);
}
});
//个人用的handel 也可以用 别的
new Thread() {
@Override
public void run() {
super.run();
String json = NetUrl.getJson(zon);
Log.e("gs","传入的json------"+zon);
Log.e("gs","接受d-------"+json.toString());
Message message = handler.obtainMessage();
message.what = 0;
message.obj = json;
handler.sendMessage(message);
}
}.start();
}else {
Log.e("gs","没有网络");
// 数据库的读取
Cursor cursor = dao.bquery("beau", null, null, null, null, null, null);
if (cursor.moveToFirst()){
//读取20条数据
int i = 0;
do{
String title = cursor.getString(cursor.getColumnIndex("title"));
String ctime = cursor.getString(cursor.getColumnIndex("ctime"));
list.add(new JsonBean.NewslistBean(ctime,title,null,null,null));
i++;
if (i==20){
break;
}
}while (cursor.moveToNext());
}
//记得关闭流
cursor.close();
}
}
//handel
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
Gson gson = new Gson();
String str = (String) msg.obj;
Log.e("gs","接受handel obj-------"+str);
JsonBean jsonBean = gson.fromJson(str,JsonBean.class);
List<JsonBean.NewslistBean> newslist = jsonBean.getNewslist();
list.addAll(newslist);
放入数据库
for (int i = 0; i <newslist.size() ; i++) {
ContentValues values = new ContentValues();
values.put("title",newslist.get(i).getTitle());
values.put("ctime",newslist.get(i).getCtime());
values.put("picUrl",newslist.get(i).getPicUrl());
dao.binsert("beau",null,values);
}
adapter.notifyDataSetChanged(); //刷新适配器
plv.onRefreshComplete(); // 让刷新头和刷新底部返回
break;
}
}
};
想想还是写上数据库的代码 不解释过多
SQLiteOpenHelper 层:
//继承SQLiteOpenHelper
public class MySql extends SQLiteOpenHelper {
public MySql(Context context) {
super(context, "***.db", null, 1);
// 创建数据库名
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表明
db.execSQL("create table beau(id INTEGER primary key autoincrement,title text,ctime text,picUrl text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
dao层:
private Context context;
private final SQLiteDatabase db;
public MyDao(Context context) {
this.context = context;
MySql mySql = new MySql(context);
db = mySql.getWritableDatabase();
}
public long binsert(String table, String nullColumnHack, ContentValues values) {
return db.insert(table,nullColumnHack,values);
}
public Cursor bquery(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy) {
return db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
}
写的不好,请多多点评指导: