listview展示網路資料+網路圖片+資料庫增刪改查+fragment
阿新 • • 發佈:2018-11-10
MainActivity
package com.bwie.renzhili; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.RadioGroup; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private RadioGroup radioGroup; private List<Fragment> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取資源id viewPager=findViewById(R.id.viewpager); radioGroup=findViewById(R.id.radiogroup); //例項化list新增fragment list = new ArrayList<>(); list.add(new FragmentOne()); list.add(new FragmentTwo()); list.add(new Fragmentthree()); //建立介面卡 viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int i) { return list.get(i); } @Override public int getCount() { return list.size(); } }); //切換fragment viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int i) { switch (i){ case 0: radioGroup.check(R.id.but1); break; case 1: radioGroup.check(R.id.but2); break; case 2: radioGroup.check(R.id.but3); break; } } @Override public void onPageScrollStateChanged(int i) { } }); //點選切換fragment radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId){ case R.id.but1: viewPager.setCurrentItem(0); break; case R.id.but2: viewPager.setCurrentItem(1); break; case R.id.but3: viewPager.setCurrentItem(2); break; } } }); } }
fragment
package com.bwie.renzhili; import android.annotation.SuppressLint; import android.os.AsyncTask; 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.AdapterView; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class FragmentOne extends Fragment { private ListView listView; private String url="http://api.expoon.com/AppNews/getNewsList/type/1/p/1"; private MyBase myBase; private NewDao dao; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //載入子佈局 View view = inflater.inflate(R.layout.fragmentont,container,false); //獲取資源id listView=view.findViewById(R.id.listview); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //建立dao dao = new NewDao(getActivity()); //建立介面卡 myBase = new MyBase(getActivity()); listView.setAdapter(myBase); getquerydata(); //長按刪除 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { //刪除 dao.delete(myBase.getItem(position).getNews_id()); //呼叫介面卡中刪除資料的方法 myBase.getdelete(position); return true; } }); } //獲取資料 private void getquerydata() { @SuppressLint("StaticFieldLeak") AsyncTask<String,Void,List<UserBean.DataBean>> asyncTask = new AsyncTask<String, Void, List<UserBean.DataBean>>() { @Override protected List<UserBean.DataBean> doInBackground(String... strings) { //建立list集合 List<UserBean.DataBean> list = new ArrayList<>(); for (String S:strings ) { UserBean bean = NetUtils.getGsondata(S, UserBean.class); list.addAll(bean.getData()); } //新增資料到資料庫 if (dao.select().size()==0){ for (UserBean.DataBean d:list ) { dao.add(d.getNews_id(),d.getNews_title(),d.getNews_summary(),d.getPic_url()); } } return dao.select(); } @Override protected void onPostExecute(List<UserBean.DataBean> dataBeans) { //傳值到介面卡 myBase.getdata(dataBeans); } }.execute(url); } }
介面卡
package com.bwie.renzhili; import android.content.Context; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MyBase extends BaseAdapter { private Context context; private List<UserBean.DataBean> list; public MyBase(Context context) { this.context = context; list=new ArrayList<>(); } //提供外部傳遞引數的方法 public void getdata( List<UserBean.DataBean> list){ this.list=list; notifyDataSetChanged(); } //刪除介面卡資料 public void getdelete(int position) { list.remove(position); notifyDataSetChanged(); } @Override public int getCount() { return list.size(); } @Override public UserBean.DataBean getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView==null){ convertView=LayoutInflater.from(context).inflate(R.layout.item,parent,false); holder=new ViewHolder(convertView); }else{ holder= (ViewHolder) convertView.getTag(); } //賦值 holder.setdata(getItem(position)); return convertView; } class ViewHolder{ TextView news_id,news_summary,news_title; ImageView imageView; public ViewHolder(View convertView){ news_id=convertView.findViewById(R.id.news_id); news_summary=convertView.findViewById(R.id.news_summary); news_title=convertView.findViewById(R.id.news_title); imageView=convertView.findViewById(R.id.image); convertView.setTag(this); } //賦值的方法 public void setdata(UserBean.DataBean item) { news_id.setText(item.getNews_id()); news_summary.setText(item.getNews_summary()); news_title.setText(item.getNews_title()); //給imageview設定tag imageView.setTag(item.getPic_url()); //介面回撥的方法 NetUtils.getloadimage(item.getPic_url(), new NetUtils.CallBack() { @Override public void setloadimage(String url, Bitmap bitmap) { //判斷設定的url是否是當前圖片url if (imageView.getTag().equals(url)){ //設定圖片 imageView.setImageBitmap(bitmap); } } }); } } }
工具類
package com.bwie.renzhili;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class NetUtils {
//解析資料的方法
public static <E> E getGsondata(String url,Class clazz){
String requery = getRequery(url);
E e = (E) new Gson().fromJson(requery, clazz);
return e;
}
//網路請求的方法
public static String getRequery(String url){
try {
URL url1 = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
int responseCode = urlConnection.getResponseCode();
if (responseCode==200){
String s = getstrarm2string(urlConnection.getInputStream());
return s;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//位元組流轉換成字元流的方法
private static String getstrarm2string(InputStream inputStream) throws IOException {
StringBuilder builder = new StringBuilder();
//建立字元緩衝流
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
//讀取字元流
for (String tmp = br.readLine();tmp!=null;tmp=br.readLine()){
builder.append(tmp);
}
return builder.toString();
}
//定義介面
public interface CallBack{
void setloadimage(String url,Bitmap bitmap);
}
//獲取圖片的方法
public static void getloadimage(final String url, final CallBack callBack){
AsyncTask<String,Void,Bitmap> asyncTask = new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... strings) {
return loadimage(strings[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
//介面回撥
callBack.setloadimage(url,bitmap);
//imageView.setImageBitmap(bitmap);
}
}.execute(url);
}
//請求網路圖片的方法
public static Bitmap loadimage(String urlimage){
try {
//建立URL
URL url1 = new URL(urlimage);
//開啟連結
HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
//設定訪問方式
urlConnection.setRequestMethod("GET");
//設定超時
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
//返回響應碼
int responseCode = urlConnection.getResponseCode();
//判斷響應是否成功
if (responseCode==200){
//將網路路徑轉換成存入bitmap
Bitmap bitmap = BitmapFactory.decodeStream(urlConnection.getInputStream());
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
bean包存放解析資料
package com.bwie.renzhili;
import java.util.List;
public class UserBean {
/**
* status : 1
* info : 獲取內容成功
* data : [{"news_id":"13811","news_title":"深港澳臺千里連線,嘉年華會今夏入川","news_summary":"6月17\u201420日,\u201c2016成都深港澳臺嘉年華會\u201d(簡稱嘉年華會)將在成都世紀城國際會展中心舉辦。其主辦方勵展華博借力旗","pic_url":"http://f.expoon.com/sub/news/2016/01/21/887844_230x162_0.jpg"},{"news_id":"13810","news_title":"第14屆溫州國際汽車展4月舉行 設9大主題展館","news_summary":"來自前不久舉行的溫州國際汽車展覽會第一次新聞釋出會的訊息, 2016第14屆溫州國際汽車展覽會定於4月7-10日在溫州國","pic_url":"http://f.expoon.com/sub/news/2016/01/21/580828_230x162_0.jpg"},{"news_id":"13808","news_title":"第十二屆中國(南安)國際水暖泵閥交易會 四大亮點","news_summary":"第十二屆中國(南安)國際水暖泵閥交易會將於2月10日至12日(即農曆正月初三至初五)在成功國際會展中心拉開帷幕。","pic_url":"http://f.expoon.com/sub/news/2016/01/21/745921_230x162_0.jpg"},{"news_id":"13805","news_title":"2016上海燈光音響展 商機無限,一觸即發","news_summary":"2016上海國際專業燈光音響展即日起全面啟動,海內外高階演藝裝置商貿平臺,商機無限,一觸即發。6大洲,80個國家,25,","pic_url":"http://f.expoon.com/sub/news/2016/01/21/158040_230x162_0.jpg"},{"news_id":"13804","news_title":"第四屆南京國際佛事展5月舉行","news_summary":"2016年,\u201c第四屆南京國際佛事文化用品展覽會\u201d將於5月26-29日在南京國際展覽中心舉辦。","pic_url":"http://f.expoon.com/sub/news/2016/01/21/865222_230x162_0.jpg"},{"news_id":"13802","news_title":"上海國際牛仔服裝博覽會 拓展國際貿易大市場","news_summary":"2016年第三屆上海國際牛仔服裝博覽會將於4月19-21日再次璀璨再現上海世博展覽館,共同探討牛仔流行趨勢,詮釋牛仔文化","pic_url":"http://f.expoon.com/sub/news/2016/01/20/370858_230x162_0.jpg"},{"news_id":"13800","news_title":"第三屆蘭州年貨會在甘肅國際會展中心本月19日開幕","news_summary":"由中國商業聯合會、甘肅省商業聯合會、蘭州市商務局主辦,甘肅省酒類商品管理局、蘭州市城關區商務局、第十四屆西安年貨會組委會","pic_url":"http://f.expoon.com/sub/news/2016/01/20/868385_230x162_0.jpg"},{"news_id":"13799","news_title":"首屆移動拍賣藝術博覽會啟動","news_summary":"首屆移動拍賣博覽會已於2016年1月全面啟動,由大咖拍賣主辦,聯合全國藝術機構共同打造拍賣藝術博覽會主會場,近百場拍賣專","pic_url":"http://f.expoon.com/sub/news/2016/01/20/768695_230x162_0.jpg"},{"news_id":"13798","news_title":"武漢金融理財投資博覽會將在5月舉辦","news_summary":"由武漢市貿促會、上海《理財週刊》社、湖北好博塔蘇斯展覽有限公司等單位聯合發起的\u201c2016武漢金融理財投資博覽會\u201d,將在武","pic_url":"http://f.expoon.com/sub/news/2016/01/20/512947_230x162_0.jpg"},{"news_id":"13796","news_title":"第三屆中國微商博覽會 3月底濟南舉辦","news_summary":"2015年,沸點天下開創了微商行業第一個展會\u2014\u2014中國微商博覽會,並於2015年成功舉行兩屆,讓微商展會從無到有,並且起了","pic_url":"http://f.expoon.com/sub/news/2016/01/20/348021_230x162_0.jpg"},{"news_id":"13793","news_title":"2016中國西部國際絲綢博覽會","news_summary":"\u201c2016年中國西部國際絲綢博覽會\u201d最新確定於2016年5月11日至15日在南充舉行。據悉,\u201c絲博會\u201d的會徽、會標及宣傳","pic_url":"http://f.expoon.com/sub/news/2016/01/19/113912_230x162_0.jpg"},{"news_id":"13792","news_title":"中國針棉織品交易會開拓\u201c西部市場\u201d","news_summary":"由國家商務部重點支援、中國紡織品商業協會主辦的第98屆中國針棉織品交易會將於3月15日~17日綻放成都。作為中國國內針棉","pic_url":"http://f.expoon.com/sub/news/2016/01/19/650175_230x162_0.jpg"},{"news_id":"13791","news_title":"樂山市第二十屆房地產展示交易會開幕","news_summary":"美麗樂山,生態宜居。今日,樂山市第二十屆房地產展示交易會在該市中心城區樂山廣場開幕,展會將持續到1月24日。","pic_url":"http://f.expoon.com/sub/news/2016/01/19/321787_230x162_0.jpg"},{"news_id":"13790","news_title":"2016華中屋面與建築防水技術展3月即將開幕","news_summary":"由湖北省建築防水協會聯合湖南、河南、江西、安徽五省建築防水協會主辦\u201c2016第二屆華中屋面與建築防水技術展覽會\u201d將於20","pic_url":"http://f.expoon.com/sub/news/2016/01/19/376254_230x162_0.jpg"},{"news_id":"13789","news_title":"2016海南國際旅遊貿易博覽會召開新聞釋出會","news_summary":"近日,三亞旅遊官方網從海南省\u201c首屆海博會\u201d新聞釋出會上獲悉,海南省\u201c首屆海博會\u201d將於2016年3月26日至4月1日在三亞","pic_url":"http://f.expoon.com/sub/news/2016/01/19/958046_230x162_0.jpg"},{"news_id":"13788","news_title":"2016阿里巴巴·貴州年貨節展銷會開幕","news_summary":"\u201c2016阿里巴巴·貴州年貨節\u201d的展銷會及迎春廟會昨日啟動。150多家餐飲商參與的美食節、近千個品種組成的年貨展銷會等,","pic_url":"http://f.expoon.com/sub/news/2016/01/19/371688_230x162_0.jpg"},{"news_id":"13787","news_title":"第二屆中國盆栽花卉交易會\u200b 本月28日開幕","news_summary":"據廣州市政府獲悉,經中國花卉協會和廣州市政府批准,第二屆中國盆栽花卉交易會將於本月28日至31日在廣州花卉博覽園舉行。屆","pic_url":"http://f.expoon.com/sub/news/2016/01/18/687647_230x162_0.jpg"},{"news_id":"13786","news_title":"李益:視野、品質、融合是展覽工程國際化的必由路徑","news_summary":"\u201c視野、品質、融合是中國展覽工程走向國際化的必由路徑。\u201d北京逸格天驕國際展覽有限公司副總經理李益日前在第二十二屆國際(常","pic_url":"http://f.expoon.com/sub/news/2016/01/18/343556_230x162_0.jpg"},{"news_id":"13785","news_title":"第八屆中國國際整合住宅產業博覽會將於5月在廣州舉辦","news_summary":"2016年1月14日,第八屆中國(廣州)國際整合住宅產業博覽會暨2016亞太建築科技論壇\u2014\u2014新聞釋出會在廣州館隆重召開。","pic_url":"http://f.expoon.com/sub/news/2016/01/18/581830_230x162_0.jpg"},{"news_id":"13784","news_title":"絲綢之路敦煌國際文化博覽會籌備工作進展順利","news_summary":"近日,絲綢之路(敦煌)國際文化博覽會組委會第二次會議在蘭召開。會議研究討論了省直廳局一對一服務保障沿線省區市方案、文博會","pic_url":"http://f.expoon.com/sub/news/2016/01/18/656693_230x162_0.jpg"}]
*/
private int status;
private String info;
private List<DataBean> data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* news_id : 13811
* news_title : 深港澳臺千里連線,嘉年華會今夏入川
* news_summary : 6月17—20日,“2016成都深港澳臺嘉年華會”(簡稱嘉年華會)將在成都世紀城國際會展中心舉辦。其主辦方勵展華博借力旗
* pic_url : http://f.expoon.com/sub/news/2016/01/21/887844_230x162_0.jpg
*/
private String news_id;
private String news_title;
private String news_summary;
private String pic_url;
public DataBean(String news_id, String news_title, String news_summary,String pic_url) {
this.news_id = news_id;
this.news_title = news_title;
this.news_summary = news_summary;
this.pic_url= pic_url;
}
public String getNews_id() {
return news_id;
}
public void setNews_id(String news_id) {
this.news_id = news_id;
}
public String getNews_title() {
return news_title;
}
public void setNews_title(String news_title) {
this.news_title = news_title;
}
public String getNews_summary() {
return news_summary;
}
public void setNews_summary(String news_summary) {
this.news_summary = news_summary;
}
public String getPic_url() {
return pic_url;
}
public void setPic_url(String pic_url) {
this.pic_url = pic_url;
}
}
}
建立資料庫
package com.bwie.renzhili;
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, "news.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//建立資料表
db.execSQL("create table new_table(id integer primary key autoincrement," +
"news_id text," +
"news_title text," +
"news_summary text," +
"pic_url text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
dao包增刪給查
package com.bwie.renzhili;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
public class NewDao {
private final MySqlite mySqlite;
private final SQLiteDatabase sb;
public NewDao(Context context){
//建立資料庫
mySqlite = new MySqlite(context);
sb = mySqlite.getReadableDatabase();
}
//查詢
public List<UserBean.DataBean> select() {
Cursor new_table = sb.query("new_table", null, null, null, null, null, null);
List<UserBean.DataBean > beans = new ArrayList<>();
while (new_table.moveToNext()){
String news_id = new_table.getString(new_table.getColumnIndex("news_id"));
String news_title = new_table.getString(new_table.getColumnIndex("news_title"));
String news_summary = new_table.getString(new_table.getColumnIndex("news_summary"));
String pic_url = new_table.getString(new_table.getColumnIndex("pic_url"));
UserBean.DataBean dataBean = new UserBean.DataBean(news_id,news_title,news_summary,pic_url);
beans.add(dataBean);
}
return beans;
}
//新增
public void add(String news_id, String news_title, String news_summary,String pic_url) {
ContentValues values = new ContentValues();
values.put("news_id",news_id);
values.put("news_title",news_title);
values.put("news_summary",news_summary);
values.put("pic_url",pic_url);
sb.insert("new_table",null,values);
}
//刪除
public void delete(String news_id) {
sb.delete("new_table","news_id=?",new String[]{news_id});
}
}
viewpager佈局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_height="0dp"
android:layout_width="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/radiogroup"/>
<RadioGroup
android:id="@+id/radiogroup"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
>
<RadioButton
android:id="@+id/but1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:button="@null"
android:text="首頁"
android:padding="10dp"
android:gravity="center"
android:layout_weight="1"
android:checked="true"
android:background="@drawable/selector"/>
<RadioButton
android:id="@+id/but2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:button="@null"
android:text="視訊"
android:padding="10dp"
android:gravity="center"
android:layout_weight="1"
android:background="@drawable/selector"/>
<RadioButton
android:id="@+id/but3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:button="@null"
android:text="我的"
android:padding="10dp"
android:gravity="center"
android:layout_weight="1"
android:background="@drawable/selector"/>
</RadioGroup>
</android.support.constraint.ConstraintLayout>