01:首先有如下四个权限:<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
02: 类BannerAdapter(继承pageradapter)掌管轮播 ,NewsListAdapter(继承Baseadapter)掌管显示,
Applic(继承Application)显示图片,NewsBean(数据库属性),NewsDao(数据库插入,显示),
NewsSqliteOpenHelper(继承SQLiteOpenHelper)数据库创建 ,HttpUtils(网络封装工具类,单例的) NetUtils(查看网络判断)
大致如以上,现开始具体代码:
APP类:
public class Applic extends Application { @Override public void onCreate() { super.onCreate(); initImageLoader(); } private void initImageLoader() { ImageLoader.getInstance().init(ImageLoaderUtils.getImageConfig(getApplicationContext())); } }
03:创建数据库类:
public class NewsSqliteOpenHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "news.db";
private static final int DB_VERSION = 1;
public NewsSqliteOpenHelper(@Nullable Context context ) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table news(_id INTEGER primary key autoincrement, url TEXT, json TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}。
04:
public class NewsDao {
private NewsSqliteOpenHelper helper;
private SQLiteDatabase db;
private NewsBean newsBean;
public NewsDao(Context context){
helper=new NewsSqliteOpenHelper(context);
db=helper.getWritableDatabase();
}
///添加
public void replace(NewsBean bean){
ContentValues values=new ContentValues();
values.put("url",bean.url);
values.put("json",bean.json);
db.replace("news",null,values);
}
//查询
public NewsBean load(String url){
NewsBean newsBean = null;
Cursor cursor = db.rawQuery("select * from news where url=? ", new String[]{url});
if (cursor.moveToNext()) {
newsBean = new NewsBean();
newsBean.url=cursor.getString(cursor.getColumnIndex("url"));
newsBean.json=cursor.getString(cursor.getColumnIndex("json"));
}
return newsBean;
}
}
05:
public class NewsBean {
public int _id;
public String url;
public String json;
public NewsBean() {
}
public NewsBean(String url, String json) {
this.url = url;
this.json = json;
}
}
06:
public class NetUtils {
private static NetworkInfo networkInfo;
public static boolean isNetConnect(Context context){
ConnectivityManager manager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo = manager.getActiveNetworkInfo();
return networkInfo.isAvailable();
}
}
07:
public class HttpUtils {
private static final HttpUtils ourInstance = new HttpUtils();
public static HttpUtils getInstance() {
return ourInstance;
}
private HttpUtils() {
}
public void getDataFromServer(String url, NetCallback callback) {
new LoadDataTask(callback).execute(url);
}
class LoadDataTask extends AsyncTask<String, Void, String> {
private NetCallback callback;
public LoadDataTask(NetCallback callback) {
this.callback = callback;
}
///解析
@Override
protected String doInBackground(String... strings) {
try {
URL url=new URL(strings[0]);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
if (connection.getResponseCode()==HttpURLConnection.HTTP_OK){
return inputStream2String(connection.getInputStream());
}
} catch (Exception e) {
callback.onError(e.getMessage());
}
return null;
}
private String inputStream2String(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
int len=-1;
byte[] b=new byte[1024];
while ((len=inputStream.read(b))!=-1){
outputStream.write(b,0,len);
}
return new String(outputStream.toByteArray());
}
@Override
protected void onPostExecute(String s) {
if (!TextUtils.isEmpty(s)){
callback.onSuccess(s);
}else {
callback.onError("没有数据");
}
}
}
public interface NetCallback{
void onSuccess(String result);
void onError(String errorMsg);
}
}
08 主页面: 其中网络数据类中的连接
public class MainActivity extends AppCompatActivity implements HttpUtils.NetCallback {
private PullToRefreshListView pullToRefreshListView;
private NewsDao newsDao;
private String url = "http://ttpc.dftoutiao.com/jsonpc/refresh?type=";
private int type = 5010;
private HttpUtils httpUtils;
private List<UINewsBean.DataBean> dataBeanList;
private NewsListAdapter newsListAdapter;
////4444
private ViewPager viewPager;
private List<ImageView> banimage;
private LinearLayout llpoints;
private List<ImageView> ponits; ///小圆点
private BannerCallback bannerCallback;
private String bannerUrl = "http://www.xieast.com/api/banner.php";
private static final int CODE_BANNER = 1;
private static final long DELAY = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
///
pullToRefreshListView = findViewById(R.id.pull_to_refresh_listview);
pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
///3
type = 5010;
//3
loadData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
//3
type++;
loadData();
///44412
}
});
dataBeanList = new ArrayList<>();
newsListAdapter = new NewsListAdapter(this, dataBeanList);
pullToRefreshListView.setAdapter(newsListAdapter);
/////44401
//////444408
newsDao = new NewsDao(this);
///请求网络
httpUtils = HttpUtils.getInstance();
loadData();
////设置轮播的布局
bannerOperator();
}
private void bannerOperator() {
////头布局
ListView refreshableView = pullToRefreshListView.getRefreshableView();
////444402
View bannerView = LayoutInflater.from(this).inflate(R.layout.bann_layout, null, false);
////44406
viewPager = bannerView.findViewById(R.id.view_pager);
llpoints = bannerView.findViewById(R.id.ll_points);
/////44407
banimage = new ArrayList<>();
ponits = new ArrayList<>();
///444404
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 600);
////44403
bannerView.setLayoutParams(params);
///444405
refreshableView.addHeaderView(bannerView);
/////444410
bannerCallback = new BannerCallback();
///444411
httpUtils.getDataFromServer(bannerUrl, bannerCallback);
}
//////////44408
class BannerCallback implements HttpUtils.NetCallback {
@Override
public void onSuccess(String result) {
///////4444413
Gson gson = new Gson();
UIBannerBean uiBannerBean = gson.fromJson(result, UIBannerBean.class);
for (UIBannerBean.DataBean dataBean : uiBannerBean.getData()) {
/////444414
ImageView imageView = new ImageView(MainActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
ImageLoader.getInstance().displayImage(dataBean.getImg(), imageView);
banimage.add(imageView);
///444415 添加圆点
ImageView point =new ImageView(MainActivity.this);
point.setImageResource(R.drawable.ponlot_yi);
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(40,40);
params.leftMargin=10;
llpoints.addView(point,params);
ponits.add(point);
}
////444416开始adapter
viewPager.setAdapter(new BannerAdapter(banimage));
changePonintState(0);
handler.sendEmptyMessageDelayed(CODE_BANNER,DELAY);
}
@Override
public void onError(String errorMsg) {
}
}
////444417
private void changePonintState(int i) {
for (int j = 0; j < ponits.size(); j++) {
if (i == j) {
ponits.get(j).setImageResource(R.drawable.ponlot_yi);
} else {
ponits.get(j).setImageResource(R.drawable.ponlot_er);
}
}
}
///////4444416
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case CODE_BANNER:
int currentItem = viewPager.getCurrentItem();
currentItem++;
viewPager.setCurrentItem(currentItem);
changePonintState(currentItem%ponits.size());
sendEmptyMessageDelayed(CODE_BANNER,DELAY);
break;
}
}
};
/////4444444417
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
}
private void loadData() {
NewsBean load = newsDao.load(url + type);
if (load != null) {
///33
showData(load.json);
} else {
if (NetUtils.isNetConnect(this)) {
httpUtils.getDataFromServer(url + type, this);
} else {
Toast.makeText(this, "请连接网络", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onSuccess(String result) {
Log.i("sss", toString());
String json = result.replace("null(", "").replace(")", "");
newsDao.replace(new NewsBean(url + type, json));
//展示33333
showData(json);
}
private void showData(String json) {
Gson gson = new Gson();
UINewsBean uiNewsBean = gson.fromJson(json, UINewsBean.class);
///3333
if (type == 5010) {
dataBeanList.clear();
}
dataBeanList.addAll(uiNewsBean.getData());
///3
HashSet hashSet = new HashSet(dataBeanList);
//3
dataBeanList.clear();
//3
dataBeanList.addAll(hashSet);
///刷新adapter
newsListAdapter.notifyDataSetChanged();
///3
pullToRefreshListView.postDelayed(new Runnable() {
@Override
public void run() {
pullToRefreshListView.onRefreshComplete();
}
}, 1000);
}
@Override
public void onError(String errorMsg) {
}
}
主布局页面
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull_to_refresh_listview"
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">
</com.handmark.pulltorefresh.library.PullToRefreshListView>
轮播布局页面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp">
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_alignParentBottom="true"
android:background="#223c3c3c"
android:gravity="center"
android:orientation="horizontal" />
</RelativeLayout>
显示数据页面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/ivIcon"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
/>
<TextView
android:id="@+id/tvDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/ivIcon"
/>
</RelativeLayout>
其中创建圆点的那个颜色,res资源目录中-drawable中右键 取名下面改成sheap 然后代码如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
>
<solid android:color="@color/colorAccent"></solid>
</shape>
至此完成数据库添加+网络判断+pull显示。