首先需要的权限有如下:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
图片跟文字 布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imag01"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
/>
<TextView
android:id="@+id/text01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/imag01"
/>
第一步写:APP 图片的加载类
public class Applic extends Application {
@Override
public void onCreate() {
super.onCreate();
interlca();
}
private void interlca() {
ImageLoader.getInstance().init(ImageLoaderUtils.getImageConfig(getApplicationContext()));
}
}
第二创建数据库:
public class NewSqltiopheple extends SQLiteOpenHelper {
private static final String DB_NAME="news.db";
private static final int DB_VERSION=1;
public NewSqltiopheple(@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) {
}
第三创建插入与添加数据库
public class NewsDao {
private NewSqltiopheple helper; 这个是创建数据库的类随便写;
private SQLiteDatabase db; 注意
private NewsBean newsBean; 创建数据库表属性
调用一下
public NewsDao(Context context){
helper=new NewSqltiopheple(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;
}
}
这是属性 切记是public
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;
}
}
第四步创建个判断网络类:
public class NetUtils {
private static NetworkInfo networkInfo;
自己写下面的 不要写错:
public static boolean isNetConnet(Context context){
ConnectivityManager manager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo=manager.getActiveNetworkInfo();
return networkInfo .isAvailable();
}
}
第五 网络工具类
public class Httplis {
private static final Httplis ourInstance = new Httplis();
public static Httplis getInstance() {
return ourInstance;
}
private Httplis() {
}
04444444
public void getDataSevery(String url, NetCallback callback){
new LoDataTask(callback).execute(url);
}
011111111
class LoDataTask extends AsyncTask<String,Void,String>{
private NetCallback callback;
public LoDataTask(NetCallback callback) {
this.callback = callback;
}
00000022222
@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("没有数据");
}
}
}
这个都是自己写(03333333)
public interface NetCallback {
void onSuccess(String result);
void onError(String errorMsg);
}
}
第六步主界面 (带3的都是设置数据库缓冲的步骤)
public class MainActivity extends AppCompatActivity implements Httplis.NetCallback {
private PullToRefreshListView pull_view;
private String url="http://www.xieast.com/api/news/news.php?page=";
private int page=1;
private Httplis httplis; 网络工具类
private NewsDao newsDao;
private List<UiNewBean.DataBean> dataBeanList; 获取数据的类
private NewsListAdapter newsListAdapter; 适配器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pull_view= findViewById(R.id.pull_view);
///解析方法
//
pull_view.setMode(PullToRefreshBase.Mode.BOTH);
pull_view.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
page=1; //33
loadData();//33
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
page++;//33
loadData();//33
}
});
dataBeanList=new ArrayList<>(); user类显示数据的
newsListAdapter = new NewsListAdapter(this,dataBeanList); 适配器
pull_view.setAdapter(newsListAdapter);
数据库跟网络封装类调用
newsDao = new NewsDao(this);
httplis = Httplis.getInstance();
loadData(); 这个是重写了方法
}
private void loadData() {
NewsBean load=newsDao.load(url+page);
if (load!=null){
showData(load.json);//33
}else {
if (NetUtils.isNetConnet(this)){
httplis.getDataSevery(url+page,this);
}else {
Toast.makeText(this,"请链接网络",Toast.LENGTH_SHORT).show();
}
}
}
//33
private void showData( String json) {
Gson gson=new Gson();
UiNewBean uiNewBean=gson.fromJson(json,UiNewBean.class);
if (page==1){
dataBeanList.clear();
}
dataBeanList.addAll(uiNewBean.getData());
HashSet hashSet=new HashSet(dataBeanList);
dataBeanList.clear();
dataBeanList.addAll(hashSet);
newsListAdapter .notifyDataSetChanged();
pull_view.postDelayed(new Runnable() {
@Override
public void run() {
pull_view.onRefreshComplete();
}
},1000);
}
@Override
public void onSuccess(String result) {
Log.i("sss",toString());
String json=result.replace("null(", "").replace(")", "");
newsDao.replace(new NewsBean(url+page,json));
showData(json);//33
}
@Override
public void onError(String errorMsg) {
}
最后一步写好优化:
public class NewsListAdapter extends BaseAdapter {
private Context context;
private List<UiNewBean.DataBean>dataBeans;
public NewsListAdapter(Context context, List<UiNewBean.DataBean> dataBeans) {
this.context = context;
this.dataBeans = dataBeans;
}
@Override
public int getCount() {
return dataBeans.size();
}
@Override 这要调用一下user
public UiNewBean.DataBean getItem(int position) {
return dataBeans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHoler holer=null;
if (convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.title_layout,null,false);
holer=new ViewHoler();
holer.imag01=convertView.findViewById(R.id.imag01);
holer.text01=convertView.findViewById(R.id.text01);
convertView.setTag(holer);
}else {
holer= (ViewHoler) convertView.getTag();
}
ImageLoader.getInstance().displayImage(dataBeans.get(position).getThumbnail_pic_s(),holer.imag01); 加载图片
holer.text01.setText(dataBeans.get(position).getTitle()); 加载文字
return convertView;
}
class ViewHoler{
ImageView imag01;
TextView text01;
}
}
缓冲+显示完成