前言
因工作需要,學了點安卓知識。現在已經能寫點簡單頁面,解析數據并展示,但是老是忘記,卡殼。特整理一下并記錄要點。
正題
一、所需框架
1.okHttp 網絡請求
2.Gson 字符串轉Json
3.GsonFormat Json轉Bean
4.Glide 加載圖片
二、特殊配置
由于我這里用到的是http請求 需要特殊配置
manifest 文件添加配置
//允許網絡訪問
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
// http請求需額外設置網絡安全配置
<application
android:networkSecurityConfig="@xml/net_work_config"
.../>
//新建net_work_config文件 配置明文訪問權限
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
三、進入正題
- Activity 核心代碼
public class HomeActivity extends AppCompatActivity {
private OkHttpClient okHttpClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initData();
}
/*初始化數據*/
private void initData() {
okHttpClient = new OkHttpClient();
//1.創建請求
Request request = new Request.Builder().url("http://v.juhe.cn/toutiao/index?key=160f6a145f32d7c5410a2437923e01ea").build();
Call call = okHttpClient.newCall(request);
//2.異步發送請求
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.i("test",e.getMessage());
}
//2.1 數據處理
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
//2.2 Json反序列化
Gson gson = new Gson();
NewsBean newsBean = gson.fromJson(response.body().string(),NewsBean.class);
//2.3 刷新UI
HomeActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
RecyclerView rv = findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
rv.setAdapter(new MyHomeAdapter(newsBean.getResult().getData(),HomeActivity.this));
}
});
}
});
}
}
- Adapter 核心代碼
public class MyHomeAdapter extends RecyclerView.Adapter<MyHomeAdapter.MyViewHolder> {
private List<NewsBean.ResultBean.DataBean> dataBeans;
private Context context;
//構造函數
public MyHomeAdapter(List<NewsBean.ResultBean.DataBean> dataBeans, Context context) {
this.dataBeans = dataBeans;
this.context = context;
}
//將home_recycler綁定給MyViewHolder
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context,R.layout.home_recycler,null);
return new MyViewHolder(view);
}
//填充展示數據
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, @SuppressLint("RecyclerView") int position) {
NewsBean.ResultBean.DataBean dataBean = dataBeans.get(position);
holder.tv_title.setText(dataBean.getTitle());
holder.tv_desc.setText(dataBean.getAuthor_name() + " " +dataBean.getDate());
Glide.with(context).load(dataBean.getThumbnail_pic_s()).into(holder.iv);
//監聽點擊事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"點擊了"+position+"行",Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return dataBeans.size();
}
//MyViewHolder 處理 將MyViewHolder持有控件 和home_recycler內部控件一一關聯
protected class MyViewHolder extends RecyclerView.ViewHolder{
private ImageView iv;
private TextView tv_title;
private TextView tv_desc;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
this.iv = itemView.findViewById(R.id.iv);
this.tv_title = itemView.findViewById(R.id.tv_title);
this.tv_desc = itemView.findViewById(R.id.tv_desc);
}
}
}
- Bean 的處理
通過GsonFormat 生成 Bean代碼
四、成品展示
1.gif