Android技能竞赛题目演练:
现在讲解的是我们的热门服务和热门主题:
涉及到的知识点有:
1: okhttp 请求的编写(在这不做讲解)
2: Glide网络图片的加载框架(可以快速简单的加载图片)
3: Recyclerview 的编写和网络数据填充
4: gson解析数据
大致的步骤就是这些,我按我的理解将我们思路梳理了一下,到现在的话我愈发理解的总结归纳的重要性,一个知识点其实难度并不大,难的是我们很多人都没有养成总结归纳的习惯
如果对知识点没有总结归纳的话不仅会影响到你的学习理解效率而且你在学习的过程中没有形成一个正向的反馈机制这个很致命的,而且严重违背了刻意练习中的原则和做法。
这里贴出一个没有完成的读书总结:希望能从中找到努力的方向:
Android技能竞赛题目演练:
现在讲解的是我们的热门服务和热门主题:
涉及到的知识点有:
1: okhttp 请求的编写(在这不做讲解)
2: Glide网络图片的加载框架(可以快速简单的加载图片)
3: Recyclerview 的编写和网络数据填充
4: gson解析数据
大致的步骤就是这些,我按我的理解将我们思路梳理了一下,到现在的话我愈发理解的总结归纳的重要性,一个知识点其实难度并不大,难的是我们很多人都没有养成总结归纳的习惯
如果对知识点没有总结归纳的话不仅会影响到你的学习理解效率而且你在学习的过程中没有形成一个正向的反馈机制这个很致命的,而且严重违背了刻意练习中的原则和做法。
这里贴出一个没有完成的读书总结:希望能从中找到努力的方向:
现在开始:我们的编程学习:
第一步的话当然是编写我们的布局文件:(这里没有详细讲okhttp网络请求的编写以后会讲)
先贴出一段代码:
以上的话就是我们的代码的详情页面具体的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity2">
<!--在我们的这个位置的话就是编写我们的myserver和我们的myhotserver的用法-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:background="#B0B2B4"
android:text="应用服务"
android:textColor="@color/black"
android:textSize="16sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/myservice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center" />
<TextView
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#B0B2B4"
android:text="热点主题"
android:textSize="16sp"
android:textColor="@color/black" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/myhotService"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
然后的话就是我们的java代码的部分:
1: 在我们的java代码中第一步就是获取到我们的前面布局文件中编写的id:
我们在我们的oncreate中编写我们的initview方法用于放置我们的id控件:
具体是在这:(已经转换为成员变量了)
第二步的话就是将网络请求来的数据通过我们的gson解析成一个bean类:
第三步就是创建我们的list数组来进行解析后数据的存储:
第四步:分别在我们的initview()方法中创建我们initrecyer方法:
第五步的话就是在我们的具体的方法中编写我们相关的代码:
// todo 这个位置的话设置的是我们的热点主题
private void initRecyclerMiddle() {
myhotService.setLayoutManager(new GridLayoutManager(MainActivity2.this,2));
myhotService.setAdapter(new MyHotRecyclerAdapter());
}
// todo 我们的这个位置的话设置的是我们的应用服务
private void initRecyclerTop() {
myservice.setLayoutManager(new GridLayoutManager(MainActivity2.this,5));
myservice.setAdapter(new MyServiceAdapter()); // 这个的话是我们的适配器
}
第六步就是编写我们相对应的适配器:
private class MyServiceAdapter extends RecyclerView.Adapter<MyServiceAdapter.MyServiceHolder> {
@NonNull
@Override
public MyServiceAdapter.MyServiceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// todo 在我们的这个位置设置我们的就是布局的文件,将我们的xml文件转换为我们的布局文件
View infater = LayoutInflater.from(MainActivity2.this).inflate(R.layout.recycelr_item,parent,false);
return new MyServiceHolder(infater);
}
@Override
public void onBindViewHolder(@NonNull MyServiceAdapter.MyServiceHolder holder, int position) {
// 在我们的这个位置适配我们的数据
if(position <=serviceBeanList.size() -1){ // todo 为什么这里要减去一,因为我们的这里的话只要一行5个但是但是我们的资源文件却有六个加载一次
// Glide.with(holder.itemView.getContext()).load(HttpUtil.BASE_URL + data.get(position).getImgUrl()).apply(MyApplication.getMyOption())
// .into(holder.myNetworkimageview);
Glide.with(MainActivity2.this).load(serviceBeanList.get(position).getImgUrl()).into(holder.netWorkImageback);
// ImageViewUtil.loadImage(serviceBeanList.get(position).getImgUrl(),holder.netWorkImageback);
// 然后的话设置我们的显示文本 //todo 这个的话是我们的数据填充
holder.textViewContent.setText(serviceBeanList.get(position).getServiceName());
}else{
Glide.with(MainActivity2.this).load(serviceBeanList.get(position-6).getImgUrl()).into(holder.netWorkImageback);
// ImageViewUtil.loadImage(serviceBeanList.get(position-6).getImgUrl(),holder.netWorkImageback);
holder.textViewContent.setText(serviceBeanList.get(position-6).getServiceName());
if(position == 9){
holder.textViewContent.setText("更多服务"); // todo 这个减去六相当于是没有了然后的话为我们的最后一个设置为指定的文本样式
}
}
holder.itemView.setOnClickListener(view -> {
// 这里的话设置我们的点击监听事件
Intent intent = new Intent(MainActivity2.this, TestActivity.class); // 这个的话相当于是一个跳转的界面然后的话这个只用编写一个界面不同的itemn会跳转到不同的界面
intent.putExtra("type",holder.textViewContent.getText().toString());
startActivity(intent);
});
}
@Override
public int getItemCount() {
if(serviceBeanList.size() == 0){
return 0; // 这个的话我们的对应的item的数量
}
return serviceBeanList.size() +4;
}
private class MyServiceHolder extends RecyclerView.ViewHolder {
private ImageView netWorkImageback;
private TextView textViewContent;
public MyServiceHolder(@NonNull View itemView) {
super(itemView);
// todo 在我们的这个位置的户先要获取我们的布局文件
netWorkImageback = (ImageView) itemView.findViewById(R.id.netWorkImageback); // todo 这个位置的话是获取我们的模板文件的id号
textViewContent = (TextView) itemView.findViewById(R.id.textView_content);
}
}
}
接下来的话是我们热门主题的适配器:
// todo 热门主题的适配器:
private class MyHotRecyclerAdapter extends RecyclerView.Adapter<MyHotRecyclerAdapter.MyHotViewHolder> {
@NonNull
@Override
public MyHotRecyclerAdapter.MyHotViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflater = LayoutInflater.from(MainActivity2.this).inflate(R.layout.recycelr_item1,parent,false);
return new MyHotViewHolder(inflater);
}
@Override
public void onBindViewHolder(@NonNull MyHotRecyclerAdapter.MyHotViewHolder holder, int position) {
// 在我们的这个位置的话适配我们的数据
if (position<= serviceBeanList.size()-1){ // todo 这个的话是我们的热门主题的数据填充,使用我们的glide框架可以快速的进行填充
Glide.with(MainActivity2.this).load(serviceBeanList.get(position).getImgUrl()).into(holder.netWorkImageback);
// ImageViewUtil.loadImage(serviceBeanList.get(position).getImgUrl(), holder.netWorkImageback);
holder.textViewContent.setText(serviceBeanList.get(position).getServiceName());
}
}
@Override
public int getItemCount() {
return serviceBeanList.size();
}
private class MyHotViewHolder extends RecyclerView.ViewHolder {
private TextView textViewContent;
private ImageView netWorkImageback;
public MyHotViewHolder(@NonNull View itemView) {
super(itemView);
// todo 这个的话就是获取我们的模板文件的ID号
netWorkImageback = (ImageView) itemView.findViewById(R.id.netWorkImageback);
textViewContent = (TextView) itemView.findViewById(R.id.textView_content);
}
}
}
最后的话就是我们的请求的编写:(可以放到最前面)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView(); // 在我们的这个位置的话调用我们的initView方法
getserviceListData();
}
private void getserviceListData() {
// 这个位置的话使用我们的网络请求获取我们的服务信息列表
HttpUtil.getInstance().doGet("/service/service/list", new OkHttpCallback() {
@Override
public void onSucess(String successString) throws IOException {
// 然后的话我们的这个位置是成功的方法
ServiceBean serviceBean = MyApplication.getGson().fromJson(successString,ServiceBean.class);
for(ServiceBean.RowsDTO row : serviceBean.getRows()){
serviceBeanList.add(new RecyclerListBean(HttpUtil.BASE_URL+row.getImgUrl(),
row.getServiceName()));//获取到我们的图片和我们的名称
}
// 对我们的图片和名称进行回调处理
myservice.post(new Runnable() {
@Override
public void run() {
// 在我们的这个位置的话显示新的数
myservice.getAdapter().notifyDataSetChanged();
myhotService.getAdapter().notifyDataSetChanged();
}
});
}
@Override
public void onFailure(String errorString) {
}
});
完整的代码如下:
package com.example.mytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.volley.toolbox.NetworkImageView;
import com.bumptech.glide.Glide;
import com.example.mytest.Util.HttpUtil;
import com.example.mytest.Util.ImageViewUtil;
import com.example.mytest.Util.OkHttpCallback;
import com.example.mytest.bean.RecyclerListBean;
import com.example.mytest.bean.ServiceBean;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity2 extends AppCompatActivity {
private RecyclerView myservice;
private RecyclerView myhotService;
private List<RecyclerListBean> serviceBeanList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView(); // 在我们的这个位置的话调用我们的initView方法
getserviceListData();
}
private void getserviceListData() {
// 这个位置的话使用我们的网络请求获取我们的服务信息列表
HttpUtil.getInstance().doGet("/service/service/list", new OkHttpCallback() {
@Override
public void onSucess(String successString) throws IOException {
// 然后的话我们的这个位置是成功的方法
ServiceBean serviceBean = MyApplication.getGson().fromJson(successString,ServiceBean.class);
for(ServiceBean.RowsDTO row : serviceBean.getRows()){
serviceBeanList.add(new RecyclerListBean(HttpUtil.BASE_URL+row.getImgUrl(),
row.getServiceName()));//获取到我们的图片和我们的名称
}
// 对我们的图片和名称进行回调处理
myservice.post(new Runnable() {
@Override
public void run() {
// 在我们的这个位置的话显示新的数
myservice.getAdapter().notifyDataSetChanged();
myhotService.getAdapter().notifyDataSetChanged();
}
});
}
@Override
public void onFailure(String errorString) {
}
});
}
private void initView() {
myservice = (RecyclerView) findViewById(R.id.myservice);
myhotService = (RecyclerView) findViewById(R.id.myhotService);
initRecyer(); // 这个位置的话展示我们的三段列表:
}
private void initRecyer() {
initRecyclerTop(); // 这个的话是我们的顶部的列表
initRecyclerMiddle(); // 这个的话是我们的中间的列表
}
// todo 这个位置的话设置的是我们的热点主题
private void initRecyclerMiddle() {
myhotService.setLayoutManager(new GridLayoutManager(MainActivity2.this,2));
myhotService.setAdapter(new MyHotRecyclerAdapter());
}
// todo 我们的这个位置的话设置的是我们的应用服务
private void initRecyclerTop() {
myservice.setLayoutManager(new GridLayoutManager(MainActivity2.this,5));
myservice.setAdapter(new MyServiceAdapter()); // 这个的话是我们的适配器
}
private class MyServiceAdapter extends RecyclerView.Adapter<MyServiceAdapter.MyServiceHolder> {
@NonNull
@Override
public MyServiceAdapter.MyServiceHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// todo 在我们的这个位置设置我们的就是布局的文件,将我们的xml文件转换为我们的布局文件
View infater = LayoutInflater.from(MainActivity2.this).inflate(R.layout.recycelr_item,parent,false);
return new MyServiceHolder(infater);
}
@Override
public void onBindViewHolder(@NonNull MyServiceAdapter.MyServiceHolder holder, int position) {
// 在我们的这个位置适配我们的数据
if(position <=serviceBeanList.size() -1){ // todo 为什么这里要减去一,因为我们的这里的话只要一行5个但是但是我们的资源文件却有六个加载一次
// Glide.with(holder.itemView.getContext()).load(HttpUtil.BASE_URL + data.get(position).getImgUrl()).apply(MyApplication.getMyOption())
// .into(holder.myNetworkimageview);
Glide.with(MainActivity2.this).load(serviceBeanList.get(position).getImgUrl()).into(holder.netWorkImageback);
// ImageViewUtil.loadImage(serviceBeanList.get(position).getImgUrl(),holder.netWorkImageback);
// 然后的话设置我们的显示文本 //todo 这个的话是我们的数据填充
holder.textViewContent.setText(serviceBeanList.get(position).getServiceName());
}else{
Glide.with(MainActivity2.this).load(serviceBeanList.get(position-6).getImgUrl()).into(holder.netWorkImageback);
// ImageViewUtil.loadImage(serviceBeanList.get(position-6).getImgUrl(),holder.netWorkImageback);
holder.textViewContent.setText(serviceBeanList.get(position-6).getServiceName());
if(position == 9){
holder.textViewContent.setText("更多服务"); // todo 这个减去六相当于是没有了然后的话为我们的最后一个设置为指定的文本样式
}
}
holder.itemView.setOnClickListener(view -> {
// 这里的话设置我们的点击监听事件
Intent intent = new Intent(MainActivity2.this, TestActivity.class); // 这个的话相当于是一个跳转的界面然后的话这个只用编写一个界面不同的itemn会跳转到不同的界面
intent.putExtra("type",holder.textViewContent.getText().toString());
startActivity(intent);
});
}
@Override
public int getItemCount() {
if(serviceBeanList.size() == 0){
return 0; // 这个的话我们的对应的item的数量
}
return serviceBeanList.size() +4;
}
private class MyServiceHolder extends RecyclerView.ViewHolder {
private ImageView netWorkImageback;
private TextView textViewContent;
public MyServiceHolder(@NonNull View itemView) {
super(itemView);
// todo 在我们的这个位置的户先要获取我们的布局文件
netWorkImageback = (ImageView) itemView.findViewById(R.id.netWorkImageback); // todo 这个位置的话是获取我们的模板文件的id号
textViewContent = (TextView) itemView.findViewById(R.id.textView_content);
}
}
}
// todo 热门主题的适配器:
private class MyHotRecyclerAdapter extends RecyclerView.Adapter<MyHotRecyclerAdapter.MyHotViewHolder> {
@NonNull
@Override
public MyHotRecyclerAdapter.MyHotViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflater = LayoutInflater.from(MainActivity2.this).inflate(R.layout.recycelr_item1,parent,false);
return new MyHotViewHolder(inflater);
}
@Override
public void onBindViewHolder(@NonNull MyHotRecyclerAdapter.MyHotViewHolder holder, int position) {
// 在我们的这个位置的话适配我们的数据
if (position<= serviceBeanList.size()-1){ // todo 这个的话是我们的热门主题的数据填充,使用我们的glide框架可以快速的进行填充
Glide.with(MainActivity2.this).load(serviceBeanList.get(position).getImgUrl()).into(holder.netWorkImageback);
// ImageViewUtil.loadImage(serviceBeanList.get(position).getImgUrl(), holder.netWorkImageback);
holder.textViewContent.setText(serviceBeanList.get(position).getServiceName());
}
}
@Override
public int getItemCount() {
return serviceBeanList.size();
}
private class MyHotViewHolder extends RecyclerView.ViewHolder {
private TextView textViewContent;
private ImageView netWorkImageback;
public MyHotViewHolder(@NonNull View itemView) {
super(itemView);
// todo 这个的话就是获取我们的模板文件的ID号
netWorkImageback = (ImageView) itemView.findViewById(R.id.netWorkImageback);
textViewContent = (TextView) itemView.findViewById(R.id.textView_content);
}
}
}
}