1. 程式人生 > >Android--使用原生技術實現ListView(原生技術實現網路非同步請求,解析json資料)

Android--使用原生技術實現ListView(原生技術實現網路非同步請求,解析json資料)

涉及到的原生技術:

1.原生技術實現網路非同步請求

1.原生技術解析json資料

實現步驟:

這裡寫圖片描述

實現程式碼:

**第一二步比較簡單,直接跳過

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.imooc.demo.R; import com.imooc.demo.app.model.LessonInfo; import com.imooc.demo.app.model.LessonResult; import org.json.JSONArray; import org.json.JSONException;
import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; () public class RequestDataActivity extends AppCompatActivity { public
static final String URL_STRING = "http://www.imooc.com/api/teacher?type=2&page=1"; private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.list_view_demo); LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = layoutInflater.inflate(R.layout.header_list_demo, null); mListView.addFooterView(view); new AppAsyncTask().execute(); } //內部類 建立資料介面卡 public class AppListAdapter extends BaseAdapter { private Context mContext; private List<LessonInfo> mInfos; public AppListAdapter(Context context, List<LessonInfo> infos) { mContext = context; mInfos = infos; } @Override public int getCount() { return mInfos.size(); } @Override public Object getItem(int position) { return mInfos.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) { viewHolder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.item_demo_list, null); / 獲取控制元件 viewHolder.nameTextView = (TextView) convertView.findViewById(R.id.title_text_view); viewHolder.avatarImageView = (ImageView) convertView.findViewById(R.id.icon_image_view); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } /和資料之間進行繫結 viewHolder.nameTextView.setText(mInfos.get(position).getName()); /設定avatarImageView空間消失 viewHolder.avatarImageView.setVisibility(View.GONE); return convertView; } class ViewHolder { ImageView avatarImageView; TextView nameTextView; } } //內部類 //實現非同步請求網路資料,並使用原生技術解析json資料和請求網路資料 public class AppAsyncTask extends AsyncTask<Void, Integer, String> { @Override protected String doInBackground(Void... params) { 非同步耗時請求 return request(URL_STRING); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); 處理資料 LessonResult lessonResult = new LessonResult(); try { JSONObject jsonObject = new JSONObject(result); int status = jsonObject.getInt("status"); String message = jsonObject.getString("msg"); //--1. lessonResult.setStatus(status); //--2. lessonResult.setMessage(message); List<LessonInfo> lessonInfos = new ArrayList<>(); JSONArray dataArray = jsonObject.getJSONArray("data"); for (int i = 0; i < dataArray.length(); i++) { LessonInfo lessonInfo = new LessonInfo(); JSONObject tempJsonObject = (JSONObject) dataArray.get(i); lessonInfo.setID(tempJsonObject.getInt("id")); lessonInfo.setName(tempJsonObject.getString("name")); lessonInfos.add(lessonInfo); } //--3. lessonResult.setLessonInfos(lessonInfos); } catch (JSONException e) { e.printStackTrace(); } mListView.setAdapter(new AppListAdapter(RequestDataActivity.this, lessonResult.getLessonInfos())); } /實現網路請求(原生程式碼) private String request(String urlString) { try { URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(30000); connection.setRequestMethod("GET"); // GET POST connection.connect(); int responseCode = connection.getResponseCode(); String responseMessage = connection.getResponseMessage(); String result = null; if (responseCode == HttpURLConnection.HTTP_OK) { InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream()); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } result = stringBuilder.toString(); } else { // TODO: } return result; } catch (IOException e) { e.printStackTrace(); } return null; } } }