1导入依赖
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.android.support:design:28.0.0'
implementation project(':channelmanagement')
implementation project(':pulltorefresh_library')
implementation 'com.google.code.gson:gson:2.2.4'
2继承baseactivity
package com.example.lianyue;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
public abstract class BaseActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(bindLayout());
initView();
initData();
bindEvent();
}
protected abstract int bindLayout();
protected abstract void initView();
protected abstract void initData();
protected abstract void bindEvent();
}
3继承basefragment
package com.example.lianyue;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public abstract class BaseFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(bindLayout(),container,false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
initData();
bindEvent();
}
protected abstract int bindLayout();
protected abstract void initView();
protected abstract void initData();
protected abstract void bindEvent();
}
4倒计时跳转布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="34dp"
android:layout_marginEnd="40dp"
android:textSize="20sp" />
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:src="@mipmap/ww"/>
</RelativeLayout>
5倒计时activity
package com.example.lianyue;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.ImageLoader;
public class MainActivity extends BaseActivity {
private TextView time;
private ImageView image;
private SharedPreferences sp;
private int i=5;
@Override
protected int bindLayout() {
return R.layout.activity_main;
}
@Override
protected void initView() {
time = findViewById(R.id.time);
sp = getSharedPreferences("login", Context.MODE_PRIVATE);
if(sp.getBoolean("第一次",false)){
startActivity(new Intent(MainActivity.this, SecondActivity.class));
i=-1;
finish();
return;
}
SharedPreferences.Editor edit = sp.edit();
edit.putBoolean("第一次",true);
edit.commit();
}
@Override
protected void initData() {
new Thread(){
@Override
public void run() {
super.run();
while (true){
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
Message message = handler.obtainMessage();
message.obj=i;
message.what=1;
handler.sendMessage(message);
i--;
if(i<0){
break;
}
}
}
}.start();
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int w = msg.what;
if(w==1){
int p=(Integer) msg.obj;
if(p>=0){
time.setText(p+"S");
if (p==0){
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}
}
}
};
@Override
protected void bindEvent() {
time.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
i=-1;
startActivity(intent);
return;
}
});
}
}
6主页面布局
<?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">
<android.support.v4.widget.DrawerLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/frag"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radio0"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:button="@null"
android:padding="5dp"
android:gravity="center"
android:background="@drawable/sel"
android:text="表格"/>
<RadioButton
android:id="@+id/radio1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:button="@null"
android:padding="5dp"
android:gravity="center"
android:background="@drawable/sel"
android:text="表格"/>
</RadioGroup>
</LinearLayout>
<LinearLayout
android:layout_width="320dp"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fff"
android:layout_gravity="left">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
7微信页面activity
package com.example.lianyue;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.example.lianyue.adapter.CeAdapter;
import com.example.lianyue.bean.JsonBean;
import com.example.lianyue.frag.FragList;
import com.example.lianyue.frag.FragNull;
import com.example.lianyue.http.Http;
import com.google.gson.Gson;
import java.util.ArrayList;
public class SecondActivity extends BaseActivity {
private RadioGroup radioGroup;
private FragList fragList;
private FragNull fragNull;
private ListView listView;
private ArrayList<JsonBean.DataBean> list;
private String str="http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
@Override
protected int bindLayout() {
return R.layout.activity_second;
}
@Override
protected void initView() {
radioGroup = findViewById(R.id.radioGroup);
radioGroup.check(radioGroup.getChildAt(0).getId());
listView = findViewById(R.id.listView);
}
@Override
protected void initData() {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
fragList = new FragList();
fragNull = new FragNull();
transaction.add(R.id.frag,fragList);
transaction.add(R.id.frag,fragNull);
transaction.show(fragList).hide(fragNull);
transaction.commit();
boolean workConnected = Http.isWorkConnected(SecondActivity.this);
if (workConnected){
Http.httpAsyncTask(str, new Http.CallbackString() {
@Override
public void getData(String s) {
Gson gson = new Gson();
JsonBean bean = gson.fromJson(s, JsonBean.class);
list = bean.getData();
listView.setAdapter(new CeAdapter(SecondActivity.this,list));
}
});
}else{
Toast.makeText(this, "没有网络", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void bindEvent() {
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction();
switch (checkedId){
case R.id.radio0:
transaction1.show(fragList).hide(fragNull);
break;
case R.id.radio1:
transaction1.show(fragNull).hide(fragList);
}
transaction1.commit();
}
});
}
}
8第一个fragment布局和tablayout
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content">
</android.support.design.widget.TabLayout>
<ImageView
android:id="@+id/tabMenu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
android:src="@mipmap/menu"/>
</LinearLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@android:color/white" />
</LinearLayout>
9第一个frag
package com.example.lianyue.frag;
import android.content.Intent;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.View;
import com.example.lianyue.BaseFragment;
import com.example.lianyue.R;
import com.example.lianyue.adapter.MyPagerAdapter;
import com.example.lianyue.frag.frag.Frag01;
import com.example.lianyue.frag.frag.Frag02;
import com.qy.channel.ChannelActivity;
import com.qy.channel.app.ChannelApplication;
import com.qy.channel.bean.ChannelItem;
import com.qy.channel.bean.ChannelManage;
import com.qy.channel.db.DBUtil;
import java.util.ArrayList;
public class FragList extends BaseFragment {
private TabLayout tabLayout;
private ViewPager pager;
private ArrayList<ChannelItem> userChannelList=new ArrayList<ChannelItem>();
private ArrayList<Fragment> fragmentList;
private MyPagerAdapter myPagerAdapter;
@Override
protected int bindLayout() {
return R.layout.fraglist;
}
@Override
protected void initView() {
tabLayout = getActivity().findViewById(R.id.tablayout);
pager = getActivity().findViewById(R.id.pager);
}
@Override
protected void initData() {
userChannelList = DBUtil.getTabData(getActivity());
fragmentList = new ArrayList<>();
for (int i=0;i<userChannelList.size();i++){
ChannelItem channelItem = userChannelList.get(i);
String getName = channelItem.getName();
Frag01 frag01 = new Frag01();
Frag02 frag02 = new Frag02();
if ("头条".equals(getName)){
fragmentList.add(frag01);
}else{
fragmentList.add(frag02);
}
}
//设置适配器
myPagerAdapter = new MyPagerAdapter(getActivity().getSupportFragmentManager(), fragmentList, userChannelList);
pager.setAdapter(myPagerAdapter);
//绑定
tabLayout.setupWithViewPager(pager);
}
@Override
protected void bindEvent() {
//1点击跳转频道管理
getActivity().findViewById(R.id.tabMenu).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//2跳转activity
Intent intent=new Intent(getActivity(), ChannelActivity.class);
//3跳转回传
startActivityForResult(intent,0);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//4判断是不是我们的回传值 回传值是0
if (resultCode==0){
//5查找数据库中的数据,找到我们要展示的tab标签
userChannelList = DBUtil.getTabData(getActivity());
//6遍历数据
for (int i=0;i<userChannelList.size();i++){
ChannelItem channelItem =(ChannelItem) userChannelList.get(i);
String tabName = channelItem.getName();
//9把数据添加到tab中
tabLayout.addTab(tabLayout.newTab().setText(tabName));
//设置fragment
if ("头条".equals(tabName)){
fragmentList.add(new Frag01());
}else{
fragmentList.add(new Frag02());
}
}
myPagerAdapter = new MyPagerAdapter(getActivity().getSupportFragmentManager(), fragmentList, userChannelList);
pager.setAdapter(myPagerAdapter);
//绑定
tabLayout.setupWithViewPager(pager);
}
}
}
10prage适配器
package com.example.lianyue.adapter;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.qy.channel.bean.ChannelItem;
import java.util.ArrayList;
public class MyPagerAdapter extends FragmentPagerAdapter {
private ArrayList<ChannelItem> userChannelList;
private ArrayList<Fragment> fragmentList;
public MyPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragmentList, ArrayList<ChannelItem> userChannelList) {
super(fm);
this.fragmentList=fragmentList;
this.userChannelList=userChannelList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return userChannelList.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return userChannelList.get(position).getName();
}
}
11第一个tab fragment布局
<?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">
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>
12tab 代码
package com.example.lianyue.frag.frag;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.support.annotation.NonNull;
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.ListView;
import android.widget.Toast;
import com.example.lianyue.BaseFragment;
import com.example.lianyue.R;
import com.example.lianyue.adapter.MyAdapter;
import com.example.lianyue.bean.JsonBean;
import com.example.lianyue.http.Http;
import com.example.lianyue.sql.Dao;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.ArrayList;
/**
* @Auther: 薄帅北
* @Date: 2019/1/15 14:52:34
* @Description:
*/
public class Frag01 extends BaseFragment {
private PullToRefreshListView listp;
private String str="http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
private ArrayList<JsonBean.DataBean> list;
private MyAdapter myAdapter;
private Dao dao;
@Override
protected int bindLayout() {
return R.layout.frag01;
}
@Override
protected void initView() {
listp = getActivity().findViewById(R.id.pull);
listp.setMode(PullToRefreshBase.Mode.BOTH);
listp.setSaveFromParentEnabled(true);
dao = new Dao(getActivity());
}
@Override
protected void initData() {
boolean workConnected = Http.isWorkConnected(getActivity());
if(workConnected){
Http.httpAsyncTask(str, new Http.CallbackString() {
@Override
public void getData(String s) {
Gson gson = new Gson();
JsonBean bean = gson.fromJson(s, JsonBean.class);
list = bean.getData();
//Toast.makeText(getActivity(), ""+list.toString(), Toast.LENGTH_SHORT).show();
if(dao.query("json",null,null,null,null,null,null).moveToFirst()){
}else{
for (JsonBean.DataBean jsonbean:list){
ContentValues values = new ContentValues();
values.put("title",jsonbean.getNews_title());
values.put("img",jsonbean.getPic_url());
dao.insert("json",null,values);
}
}
myAdapter=new MyAdapter(getActivity(),list);
listp.setAdapter(myAdapter);
}
});
}else{
Cursor query = dao.query("json", null, null, null, null, null, null);
list=new ArrayList<>();
if(query.moveToFirst()){
do {
String title = query.getString(query.getColumnIndex("title"));
String img = query.getString(query.getColumnIndex("img"));
list.add(new JsonBean.DataBean(title,img));
}while (query.moveToNext());
}
query.close();;
Toast.makeText(getActivity(), "没有网络", Toast.LENGTH_SHORT).show();
myAdapter=new MyAdapter(getActivity(),list);
listp.setAdapter(myAdapter);
}
}
@Override
protected void bindEvent() {
listp.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
if (Http.isWorkConnected(getActivity())){
Http.httpAsyncTask(str, new Http.CallbackString() {
@Override
public void getData(String s) {
Gson gson = new Gson();
JsonBean bean = gson.fromJson(s, JsonBean.class);
list = bean.getData();
myAdapter = new MyAdapter(getActivity(),list);
listp.setAdapter(myAdapter);
listp.onRefreshComplete();
}
});
}else{
Toast.makeText(getActivity(), "没有网络", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
if (Http.isWorkConnected(getActivity())){
Http.httpAsyncTask(str, new Http.CallbackString() {
@Override
public void getData(String s) {
Gson gson = new Gson();
JsonBean bean = gson.fromJson(s, JsonBean.class);
ArrayList<JsonBean.DataBean> data = bean.getData();
list.addAll(data);
myAdapter.notifyDataSetChanged();
listp.onRefreshComplete();
}
});
}else{
Toast.makeText(getActivity(), "没有网络", Toast.LENGTH_SHORT).show();
}
}
});
}
}
13图片设置app包
package com.example.lianyue.app;
import android.app.Application;
import android.graphics.Bitmap;
import android.os.Environment;
import com.example.lianyue.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
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.CircleBitmapDisplayer;
import com.qy.channel.app.ChannelApplication;
import java.io.File;
public class App extends ChannelApplication {
@Override
public void onCreate() {
super.onCreate();
String path = Environment.getExternalStorageDirectory().getParentFile() + "TuPian";
File file = new File(path);
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.zhan)
.showImageOnFail(R.mipmap.shibai)
.displayer(new CircleBitmapDisplayer())
.bitmapConfig(Bitmap.Config.ARGB_8888)
.build();
ImageLoaderConfiguration loaderConfiguration = new ImageLoaderConfiguration.Builder(this)
.defaultDisplayImageOptions(options)
.diskCache(new UnlimitedDiskCache(file))
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.build();
ImageLoader imageLoader=ImageLoader.getInstance();
imageLoader.init(loaderConfiguration);
}
}
14http网络判断包
package com.example.lianyue.http;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import javax.security.auth.callback.Callback;
public class Http {
//判断网络
public static boolean isWorkConnected(Context context){
if(context!=null){
ConnectivityManager manager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if(info!=null){
return info.isAvailable();
}
}
return false;
}
//创建网络接口
public static void httpAsyncTask(String strUrl,final CallbackString backString){
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... strings) {
return requestHttpGet(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
backString.getData(s);
}
}.execute(strUrl);
}
public interface CallbackString{
void getData(String s);
}
public static String requestHttpGet(String strUrl){
try {
URL url = new URL(strUrl);
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int code = connection.getResponseCode();
if(code==200){
InputStream stream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "utf-8"));
StringBuilder builder = new StringBuilder();
String str="";
while ((str=reader.readLine())!=null){
builder.append(str);
}
return builder.toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
15数据库
package com.example.lianyue.sql;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.app.FragmentActivity;
public class Dao {
private final SQLiteDatabase db;
public Dao(Context context) {
MySqlite mysqlite=new MySqlite(context);
db = mysqlite.getWritableDatabase();
}
public long insert(String table, String nullColumnHack, ContentValues values) {
return db.insert(table,nullColumnHack,values);
}
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) {
return db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
}
}
16数据库
package com.example.lianyue.sql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MySqlite extends SQLiteOpenHelper {
public MySqlite(Context context) {
super(context, "bw.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table json(id integer primary key autoincrement,title text,img text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
17注册
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
android:name=".app.App"
<activity android:name=".SecondActivity"/>