http請求解析json listview多條目展示 +跳轉webview展示
阿新 • • 發佈:2018-11-22
1.Mainactivity主頁面
package com.example.week01_02; import android.annotation.SuppressLint; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import java.util.ArrayList; import java.util.List; import static com.example.week01_02.LoginActivity.URL_KEY; public class MainActivity extends AppCompatActivity { private ListView listView; private NewsAdaper mAdaper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取資源id listView = findViewById(R.id.lv_list); //建立介面卡 mAdaper = new NewsAdaper(MainActivity.this); listView.setAdapter(mAdaper); //點選跳轉 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this,LoginActivity.class); intent.putExtra(URL_KEY,mAdaper.getItem(position).getUrl()); startActivity(intent); } }); infoData(); } private static String ttUrl = "http://result.eolinker.com/k2BaduF2a6caa275f395919a66ab1dfe4b584cc60685573?uri=tt"; private static String gnUrl = "http://result.eolinker.com/k2BaduF2a6caa275f395919a66ab1dfe4b584cc60685573?uri=gn"; @SuppressLint("StaticFieldLeak") private void infoData() { new AsyncTask<String,Void,List<NewsBean.ResultBean.DataBean>>(){ @Override protected List<NewsBean.ResultBean.DataBean> doInBackground(String... strings) { List<NewsBean.ResultBean.DataBean> request = new ArrayList<>(); for (String url:strings) { NewsBean bean = NetUtil.getRequest(url, NewsBean.class); request.addAll(bean.getResult().getData()); } return request; } @Override protected void onPostExecute(List<NewsBean.ResultBean.DataBean> dataBeans) { mAdaper.setmData(dataBeans); } }.execute(ttUrl,gnUrl); } }
2.Bean類
package com.example.week01_02; import java.util.List; public class NewsBean { private ResultBean result; public ResultBean getResult() { return result; } public void setResult(ResultBean result) { this.result = result; } public static class ResultBean { private List<DataBean> data; public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { private static final String tt = "頭條"; private String title; private String date; private String category; private String url; private String thumbnail_pic_s; public static String getTt() { return tt; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getThumbnail_pic_s() { return thumbnail_pic_s; } public void setThumbnail_pic_s(String thumbnail_pic_s) { this.thumbnail_pic_s = thumbnail_pic_s; } public boolean isTT(){ return category.equals(tt); } } } }
3.介面卡類
package com.example.week01_02; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.VideoView; import java.util.ArrayList; import java.util.List; public class NewsAdaper extends BaseAdapter { private List<NewsBean.ResultBean.DataBean> mData; private Context mContext; private static final int ITEM_COUNT = 2; private static final int TT_ITEM = 0; private static final int GN_ITEM = 1; public NewsAdaper(Context mContext) { this.mContext = mContext; //初始化 mData = new ArrayList<>(); } public void setmData(List<NewsBean.ResultBean.DataBean> datas){ this.mData = datas; notifyDataSetChanged(); } @Override public int getViewTypeCount() { return ITEM_COUNT; } @Override public int getItemViewType(int position) { return getItem(position).isTT()?TT_ITEM:GN_ITEM; } @Override public int getCount() { return mData.size(); } @Override public NewsBean.ResultBean.DataBean getItem(int position) { return mData.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(mContext).inflate( getItemViewType(position)==TT_ITEM?R.layout.tt_item:R.layout.gn_item,parent,false); holder = new ViewHolder(convertView); }else{ holder = (ViewHolder) convertView.getTag(); } holder.bind(getItem(position)); return convertView; } class ViewHolder{ ImageView image; TextView title; TextView date; public ViewHolder(View convertView) { title = convertView.findViewById(R.id.title); date = convertView.findViewById(R.id.date); image = convertView.findViewById(R.id.image); convertView.setTag(this); } public void bind(NewsBean.ResultBean.DataBean item) { title.setText(item.getTitle()); date.setText(item.getDate()); if(image!=null){ image.setImageResource(R.mipmap.ic_launcher); } } } }
4.工具類
package com.example.week01_02;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
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.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class NetUtil {
//判斷是否有網路
public static boolean hasNetWork(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
return activeNetworkInfo!=null&&activeNetworkInfo.isAvailable();
}
//執行get請求 返回string
public static String getRequest(String urlStr){
String result = "";
try {
//定義url地址
URL url = new URL(urlStr);
//開啟連線
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//設定請求型別
urlConnection.setRequestMethod("GET");
//超時
urlConnection.setReadTimeout(5000);
urlConnection.setConnectTimeout(5000);
//獲取請求碼
int responseCode = urlConnection.getResponseCode();
if(responseCode == 200 ){
result = stream2String(urlConnection.getInputStream());
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
//將位元組流轉換為字元流
private static String stream2String(InputStream inputStream) throws IOException {
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(isr);
StringBuilder builder = new StringBuilder();
for(String tem = br.readLine();tem!=null;tem = br.readLine()){
builder.append(tem);
}
return builder.toString();
}
//執行get請求 返回Bean
public static <E> E getRequest(String urlStr,Class clazz){
String request = getRequest(urlStr);
E e = (E) new Gson().fromJson(request,clazz);
return e;
}
}
5.跳轉展示webview頁面
package com.example.week01_02;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
public class LoginActivity extends AppCompatActivity {
public static final String URL_KEY = "url";
private WebView webView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//獲取資源id
webView = findViewById(R.id.web);
//接收
String url = getIntent().getStringExtra(URL_KEY);
webView.loadUrl(url);
}
}
6.佈局頁面
6.1mainactivity頁面佈局
<?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">
<ListView
android:id="@+id/lv_list"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</android.support.constraint.ConstraintLayout>
6.2listview子條目佈局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/image"
android:layout_width="120dp"
android:layout_height="100dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintRight_toLeftOf="@id/image"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="@id/image"
android:text="標題"
/>
<TextView
android:id="@+id/date"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintRight_toLeftOf="@id/image"
app:layout_constraintLeft_toLeftOf="parent"
android:text="時間"
app:layout_constraintBottom_toBottomOf="@id/image"
/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:maxLines="2"
android:text="title"
app:layout_constraintBottom_toTopOf="@id/date"
/>
<TextView
android:id="@+id/date"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
android:maxLines="2"
android:layout_marginTop="15sp"
android:text="日期"
/>
</android.support.constraint.ConstraintLayout>
6.3跳轉頁面佈局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<WebView
android:id="@+id/web"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</android.support.constraint.ConstraintLayout>