博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android项目实战 | 从零开始写app(14)】实现用户中心模块清除token退出登录 & 信息修改等功能
阅读量:501 次
发布时间:2019-03-07

本文共 35134 字,大约阅读时间需要 117 分钟。

五一后,被ji金伤了,哇呜呜,还是得苦逼老老实实打工写代码,看下面吧

本篇实现效果:

在这里插入图片描述

实现登录用户名展示到用户中心页面上,并且页面有个人信息,订单列表,修改密码,意见反馈发送到服务端,前面登录后,通过SharedPreferencestoken值保存到本地,退出登录时,用editor.clear()直接清除保存的koten,跳转到登录界面。本篇用的技术同样是gson+okhttp,老生常谈了,写过那么多遍,因该都懂了,哈哈~,我就当这样默认了。


文章导航

十三、【Android项目实战 | 从零开始写app(13)】实现服务页面数据的解析

十五、【Android项目实战 | 从零开始写app(15)】实现发布模块…


功能逻辑实现

在前面的基础上,继续完善项目,没有的请看前面系列文章

UserFragment:

在UserFragment中加入下面代码:

package com.example.myapp.fragment;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.RadioGroup;import android.widget.ScrollView;import android.widget.TextView;import androidx.appcompat.widget.Toolbar;import androidx.viewpager.widget.ViewPager;import com.example.myapp4.R;import com.example.myapp4.activity.AdviseActivity;import com.example.myapp4.activity.LoginActivity;import com.example.myapp4.activity.OrderActivity;import com.example.myapp4.activity.UpdataPSWActivity;import com.example.myapp4.activity.UserInfoActivity;/** * @ProjectName: MyApp * @Package: com.example.myapp.fragment * @ClassName: UserFragment * @Description: * @Author: liyingxia * @CreateDate: 2021/05/06 22:50 */public class UserFragment extends BaseFragment implements View.OnClickListener {
private static final String TAG = UserFragment.class.getSimpleName(); private TextView tv_usercenter; private TextView tv_username; private ImageButton user_img; private Button btn_out; private Intent intent = null; private LinearLayout ll_info; private LinearLayout ll_order; private LinearLayout ll_update; private LinearLayout ll_advice; private Toolbar toolbar; @Override public View initView() {
Log.i(TAG, "用户中心的视图被实例化了"); View view = View.inflate(getContext(), R.layout.fragment_user, null); ll_advice = view.findViewById(R.id.ll_advice); ll_info = view.findViewById(R.id.ll_info); ll_order = view.findViewById(R.id.ll_order); ll_update = view.findViewById(R.id.ll_update); btn_out = view.findViewById(R.id.btn_out); tv_username = view.findViewById(R.id.tv_username); user_img = view.findViewById(R.id.user_img); ll_update.setOnClickListener(this); ll_info.setOnClickListener(this); ll_order.setOnClickListener(this); ll_advice.setOnClickListener(this); btn_out.setOnClickListener(this); user_img.setOnClickListener(this); return view; }/* @Override public void onStart() { super.onStart(); toolbar.setTitle("个人中心"); //setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.mipmap.top_bar_left_back); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // finish(); } }); }*/ @Override public void initData() {
super.initData(); // 读取本地保存用户的登录信息 SharedPreferences sp = getActivity().getSharedPreferences("token_data", Context.MODE_PRIVATE); String user = sp.getString("username",""); // 把用户名显示到textView控件上 tv_username.setText(user); } @Override public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_info: intent = new Intent(getContext(), UserInfoActivity.class); break; case R.id.ll_order: intent = new Intent(getContext(), OrderActivity.class); break; case R.id.ll_update: intent = new Intent(getContext(), UpdataPSWActivity.class); break; case R.id.ll_advice: intent = new Intent(getContext(), AdviseActivity.class); break; case R.id.btn_out: SharedPreferences.Editor editor = getActivity().getSharedPreferences("token_data", Context.MODE_PRIVATE).edit(); editor.clear(); // 清除本地保存的token值 editor.apply(); intent = new Intent(getContext(), LoginActivity.class); break; case R.id.user_img: break; } // 页面跳转 startActivity(intent); }}

上面的editor.clear() 实现清除本地保存的token值,最后记得apply()提交。其他都是简单点击实现页面跳转。

fragment_user.xml:

用户中心页面布局,一些文本text,color等资源应该放到style目录下,方便后期维护修改,比较统一,但我没有这样做,就直接这样写了,你们可以自己实现,不清楚的看我前面文章:

在这里插入图片描述

AdviseActivity:

意见反馈页面

package com.example.myapp4.activity;import android.annotation.SuppressLint;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import com.example.myapp.R;import com.example.myapp.utils.APIConfig;import com.example.myapp.utils.GetToken;import org.json.JSONException;import org.json.JSONObject;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class AdviseActivity extends AppCompatActivity implements View.OnClickListener {
private ImageButton btn_back; private EditText content; private Button btn_send; // 更新主线程的UI @SuppressLint("HandlerLeak") private Handler handler = new Handler(){
// 接收消息 @Override public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg); if (msg.what==1) {
String re = msg.obj.toString(); Toast.makeText(getApplicationContext(),"反馈成功:"+re,Toast.LENGTH_LONG).show(); } } }; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_advise); initView(); } private void initView() {
btn_back = (ImageButton) findViewById(R.id.btn_back); content = (EditText) findViewById(R.id.content); btn_send = (Button) findViewById(R.id.btn_send); btn_back.setOnClickListener(this); btn_send.setOnClickListener(this); } @Override public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back: finish(); break; case R.id.btn_send: SendAdavice(); break; } } // 发送建议反馈到服务端 private void SendAdavice() {
String contentString = content.getText().toString().trim(); if (TextUtils.isEmpty(contentString)) {
Toast.makeText(this, "内容不能为空", Toast.LENGTH_SHORT).show(); return; } // 获取SharedPreferences对象 SharedPreferences sp = this.getSharedPreferences("token_data",MODE_PRIVATE); String token = sp.getString("token",""); // 实例化OkHttpClient 对象 OkHttpClient client = new OkHttpClient(); // 实例化 JSONObject JSONObject object = new JSONObject(); try {
object.put("content",contentString); object.put("userid",8888); } catch (JSONException e) {
e.printStackTrace(); } // 设置传递的数据类型 MediaType mediaType = MediaType.parse("application/json;charset=utf-8"); RequestBody requestBody = RequestBody.create(mediaType,object.toString()); Request request = new Request.Builder() .post(requestBody) .url(APIConfig.BASE_URL+"/userinfo/feedback") .addHeader("Authorization",token) .build(); Call call = client.newCall(request); call.enqueue(new Callback() {
// 响应失败 @Override public void onFailure(Call call, IOException e) {
Log.i("onFailure",e.getMessage()); } // 响应成功 @Override public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String result = response.body().string(); // 创建Message 对象 Message msg = new Message(); /* * what是自定义的一个Message的识别码,以便于在Handler的handleMessage方 *法中根据what识别出不同的Message,以便我们做出不同的处理操作 */ msg.what=1; // 通过给obj赋值Object类型传递向Message传入请求到的数据 msg.obj=result; // 发送消息 handler.sendMessage(msg); } } }); }}

MediaType指的是要传递的数据的MIME类型,MediaType对象包含了三种信息:typesubtype以及charset,一般将这些信息传入parse()方法中,这样就可以解析出MediaType对象,比如 “application/json; charset=utf-8” ,用来告诉服务端消息主体是序列化后的 JSON 字符串 charset=utf-8 则表示采用UTF-8编码。如果不知道某种类型数据的MIME类型,可以参见和,这里不再多说。

  • json : application/json
  • xml : application/xml
  • png : image/png
  • jpg : image/jpeg
  • gif : imge/gif

这里用Handler 处理异步消息处理,它的主要作用:消息处理者,主要用于发送跟处理消息,发送消息:SendMessage(),处理消息: HandleMessage()

子线程中更新主线程的UI。

Handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。

上面的msg.what=1中的what是自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别出不同的Message,以便我们做出不同的处理操作。通过给obj赋值Object类型传递向Message传入请求到的数据。

activity_advise.xml:

在这里插入图片描述

修改密码:

UpdataPSWActivity:

package com.example.myapp4.activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import com.example.myapp4.R;import com.example.myapp4.bean.LoginBean;import com.example.myapp4.bean.UserBean;import com.example.myapp4.utils.APIConfig;import com.google.gson.Gson;import org.json.JSONException;import org.json.JSONObject;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class UpdataPSWActivity extends AppCompatActivity implements View.OnClickListener {
private ImageButton btn_back; private EditText userId; private EditText et_old_psw; private EditText et_new_psw; private Button btn_update; private Button btn_clear; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_updata_psw); initView(); } private void initView() {
btn_back = (ImageButton) findViewById(R.id.btn_back); userId = (EditText) findViewById(R.id.userId); et_old_psw = (EditText) findViewById(R.id.et_old_psw); et_new_psw = (EditText) findViewById(R.id.et_new_psw); btn_update = (Button) findViewById(R.id.btn_update); btn_clear = (Button) findViewById(R.id.btn_clear); btn_back.setOnClickListener(this); btn_update.setOnClickListener(this); btn_clear.setOnClickListener(this); } @Override public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back: finish(); break; case R.id.btn_update: Update(); break; case R.id.btn_clear: userId.setText(""); et_old_psw.setText(""); et_new_psw.setText(""); break; } } private void Update() {
String userIdString = userId.getText().toString().trim(); if (TextUtils.isEmpty(userIdString)) {
Toast.makeText(this, "请输入你的用户编号", Toast.LENGTH_SHORT).show(); return; } String old_password = et_old_psw.getText().toString().trim(); if (TextUtils.isEmpty(old_password)) {
Toast.makeText(this, "请输入你的原始密码", Toast.LENGTH_SHORT).show(); return; } String password = et_new_psw.getText().toString().trim(); if (TextUtils.isEmpty(password)) {
Toast.makeText(this, "请输入你的新密码", Toast.LENGTH_SHORT).show(); return; } SharedPreferences sp = getSharedPreferences("token_data",MODE_PRIVATE); String user_psw = sp.getString("password",""); String token = sp.getString("token",""); OkHttpClient client = new OkHttpClient(); JSONObject json = new JSONObject(); try {
json.put("userId",userIdString); json.put("oldPwd",old_password); json.put("password",password); } catch (JSONException e) {
e.printStackTrace(); } MediaType mediaType = MediaType.parse("application/json;charset=utf-8"); RequestBody requestBody = RequestBody.create(mediaType,json.toString()); Request request = new Request.Builder() .url(APIConfig.BASE_URL+"/system/user/resetPwd") .addHeader("Authorization",token) .post(requestBody) .build(); Call call = client.newCall(request); call.enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
Log.i("请求失败",e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String result = response.body().string(); Gson gson = new Gson(); LoginBean loginBean = gson.fromJson(result,LoginBean.class); String code = loginBean.getCode(); if (code=="200") {
runOnUiThread(new Runnable() {
@Override public void run() {
Toast.makeText(UpdataPSWActivity.this,"密码更新成功:"+result,Toast.LENGTH_LONG).show(); } }); } } } }); }}

activity_updata_psw.xml:

在这里插入图片描述

个人信息:

修改个人信息属于个人隐私的数据,在请求服务端数据时,需要在okhttp中的addHeader("Authorization",token)请求头带上Authorization 标识的token值来验证请求。

UserInfoActivity:

package com.example.myapp.activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import com.example.myapp.R;import com.example.myapp.bean.ResponseBean;import com.example.myapp.utils.APIConfig;import com.google.gson.Gson;import org.json.JSONObject;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class UserInfoActivity extends AppCompatActivity implements View.OnClickListener {
private ImageButton btn_back; private ImageView ib_img; private EditText et_nicke; private EditText et_phone; private EditText et_email; private EditText et_idetity; private RadioButton rb_man; private RadioButton rb_woman; private RadioGroup rg_sex; private Button btn_update; private Button btn_clear; private String sex = ""; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_info); initView(); } private void initView() {
btn_back = (ImageButton) findViewById(R.id.btn_back); ib_img = (ImageView) findViewById(R.id.ib_img); et_nicke = (EditText) findViewById(R.id.et_nicke); et_phone = (EditText) findViewById(R.id.et_phone); et_email = (EditText) findViewById(R.id.et_email); et_idetity = (EditText) findViewById(R.id.et_idetity); rb_man = (RadioButton) findViewById(R.id.rb_man); rb_woman = (RadioButton) findViewById(R.id.rb_woman); rg_sex = (RadioGroup) findViewById(R.id.rg_sex); btn_update = (Button) findViewById(R.id.btn_update); btn_clear = (Button) findViewById(R.id.btn_clear); btn_back.setOnClickListener(this); btn_update.setOnClickListener(this); btn_clear.setOnClickListener(this); rg_sex.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override public void onCheckedChanged(RadioGroup radioGroup, int i) {
if (rb_man.isChecked()) {
sex = "1"; } else {
sex = "0"; } } }); } @Override public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back: finish(); break; case R.id.btn_update: UpdateInfo(); break; case R.id.btn_clear: // 清空 et_nicke.setText(""); et_phone.setText(""); et_phone.setText(""); et_idetity.setText(""); et_email.setText(""); sex = ""; break; } } private void UpdateInfo() {
//输入校验 String nicke = et_nicke.getText().toString().trim(); if (TextUtils.isEmpty(nicke)) {
Toast.makeText(this, "请输入昵称", Toast.LENGTH_SHORT).show(); return; } String phone = et_phone.getText().toString().trim(); if (TextUtils.isEmpty(phone)) {
Toast.makeText(this, "请输入你的手机号码", Toast.LENGTH_SHORT).show(); return; } String email = et_email.getText().toString().trim(); if (TextUtils.isEmpty(email)) {
Toast.makeText(this, "请输入你的邮箱地址", Toast.LENGTH_SHORT).show(); return; } String idetity = et_idetity.getText().toString().trim(); if (TextUtils.isEmpty(idetity)) {
Toast.makeText(this, "4405281999121411040640", Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(sex)){
Toast.makeText(this, "请选择你的性别", Toast.LENGTH_SHORT).show(); return; } SharedPreferences sp = this.getSharedPreferences("token_data",MODE_PRIVATE); String token = sp.getString("token",""); String username = sp.getString("username",""); // 实例化 OkHttpClient OkHttpClient client = new OkHttpClient(); // 实例化 JSONObject JSONObject object = new JSONObject(); try {
object.put("userId",111); object.put("idCard",idetity); object.put("userName",username); object.put("nickName",nicke); object.put("phonenumber",phone); object.put("email",email); object.put("sex",sex); object.put("file",""); object.put("remark",""); } catch (Exception e) {
e.printStackTrace(); } // 设置 MediaType参数 MediaType mediaType = MediaType.parse("application/json;charset=utf-8"); // 请求体 RequestBody requestBody = RequestBody.create(mediaType,object.toString()); Request request = new Request.Builder() .url(APIConfig.BASE_URL+"/system/user/updata") // 请求url .post(requestBody) // post 请求发送数据到服务端 .addHeader("Authorization",token) 带上token 请求头 .build(); Call call = client.newCall(request); // 请求回调 call.enqueue(new Callback() {
// 异步请求 // 请求失败 @Override public void onFailure(Call call, IOException e) {
Log.i("请求失败",e.getMessage()); } // 响应成功 @Override public void onResponse(Call call, Response response) throws IOException {
// 成功 if (response.isSuccessful()) {
Gson gson = new Gson(); String result = response.body().string(); ResponseBean responseBean = gson.fromJson(result,ResponseBean.class); String code = responseBean.getCode(); if (code=="200") {
runOnUiThread(new Runnable() {
@Override public void run() {
Toast.makeText(getApplicationContext(),"用户信息修改成功:"+result,Toast.LENGTH_LONG).show();; } }); } } } }); }}

activity_user_info.xml:

修改个人信息页面布局

在这里插入图片描述

公共实体类

在bean目录下新家LoginBean.class 实体类,gson解析json数据会用到

LoginBean:

public class LoginBean {
/** * msg : 操作成功 * code : 200 * token : eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImMyYjE1YTNkLTlkNWQtNGFmZi04MGU3LTNlNWMxYTdkYzcyNSJ9.sZxcMsSvH7F50jCpTdtrv296mgq5IOI8OAo8rAXDQ4mw7KssvPsdwFcFdxHyGodfYmrsDxv0wyyEgDdl7JDxoQ */ private String msg; private String code; private String token; public String getMsg() {
return msg; } public void setMsg(String msg) {
this.msg = msg; } public String getCode() {
return code; } public void setCode(String code) {
this.code = code; } public String getToken() {
return token; } public void setToken(String token) {
this.token = token; } public LoginBean(String msg, String code, String token) {
this.msg = msg; this.code = code; this.token = token; } @Override public String toString() {
return "UserLogin{" + "msg='" + msg + '\'' + ", code=" + code + ", token='" + token + '\'' + '}'; }}

个人订单

OrderActivity:

个人订单跟解析新闻数据差不多,不过个人订单属于个人隐私的数据,在请求服务端数据时,需要在okhttp中的addHeader("Authorization",token)请求头带上Authorization 标识的token值来验证请求。

public class OrderActivity extends AppCompatActivity {
private Toolbar toolbar; private ListView order_listView; private OrderBean orderBean;/* private Handler handler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); if (msg.what==1) { String result = msg.obj.toString(); Gson gson = new Gson(); orderBean = gson.fromJson(result,OrderBean.class); OrderAdapter orderAdapter = new OrderAdapter(); order_listView.setAdapter(orderAdapter); order_listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView
adapterView, View view, int i, long l) { Toast.makeText(getApplication(),"你点击了:"+i,Toast.LENGTH_LONG).show(); } }); } } };*/ @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_order); toolbar = findViewById(R.id.toolbar); order_listView = findViewById(R.id.order_listView); getHttp(); } private void getHttp() {
// 请求参数 int pageNum = 1; int pageSize = 10; int userId = 1; 实例化 OkHttpClient 对象 OkHttpClient client = new OkHttpClient(); // 读取本地保存的token 值 SharedPreferences sp = getSharedPreferences("token_data",MODE_PRIVATE); String token =sp.getString("token",""); // 创建JSONObject 对象 JSONObject object = new JSONObject(); try {
// 带上请求体参数 object.put("pageNum",1); object.put("pageSize",10); object.put("userId",1); } catch (JSONException e) {
e.printStackTrace(); } // 设置 MediaType参数 MediaType mediaType = MediaType.parse("application/json;charset=utf-8"); // 请求体 RequestBody requestBody = RequestBody.create(mediaType,object.toString()); String url = APIConfig.BASE_URL+"/userinfo/orders/list"+"?"+pageNum+"&"+pageSize+"&"+userId; Request request = new Request.Builder() .url(url) .addHeader("Authorization",token) .build(); // 请求回调 Call call = client.newCall(request); // 重写异步请求 call.enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
Log.i("onFailure",e.getMessage()); } // 请求响应成功 @Override public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String result = response.body().string(); Log.i("请求成功",result); runOnUiThread(new Runnable() {
@Override public void run() {
// gson解析请求到的数据 Gson gson = new Gson(); orderBean = gson.fromJson(result,OrderBean.class); OrderAdapter orderAdapter = new OrderAdapter(); order_listView.setAdapter(orderAdapter); order_listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView
adapterView, View view, int i, long l) {
Toast.makeText(getApplication(),"你点击了"+i,Toast.LENGTH_LONG).show(); } }); } }); } } }); } @Override protected void onStart() {
super.onStart(); // 顶部标题栏 toolbar.setTitle("订单列表"); setSupportActionBar(toolbar); // 设置标题栏图标 toolbar.setNavigationIcon(R.mipmap.top_bar_left_back); toolbar.setTitleMarginEnd(200); // 点击事件 toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
finish(); } }); } public class OrderAdapter extends BaseAdapter {
// item 数据 @Override public int getCount() {
return orderBean.getData().size(); } @Override public Object getItem(int i) {
return orderBean.getData().get(i); } @Override public long getItemId(int i) {
return i; } // 每项item布局 @Override public View getView(int i, View view, ViewGroup viewGroup) {
HolderView holderView; if (view==null) {
view = View.inflate(getApplicationContext(),R.layout.order_item,null); holderView = new HolderView(); holderView.tv_ordernum = view.findViewById(R.id.tv_ordernum); holderView.order_date = view.findViewById(R.id.order_date); holderView.order_type = view.findViewById(R.id.order_type); view.setTag(holderView); } else {
holderView = (HolderView) view.getTag(); } holderView.order_date.setText(orderBean.getData().get(i).getCreateTime()); holderView.tv_ordernum.setText(orderBean.getData().get(i).getOrderNum()); holderView.order_type.setText("地铁"); return view; } // 优化ListView class HolderView{
TextView tv_ordernum; TextView order_date; TextView order_type; } }}

基本都注释了,我们都知道在Android中不能在主线程进行网络请求等耗时操作,而且Ui控件的更新不能在工作线程中操作,所以通过 runOnUiThread这个方法来更新UI界面。当然跟新Ui还有其他方式例如:使用AsyncTaskHandler等,这里不做深究。如果在fragment中,记得通过getActivity获取当前

activity_order.xml:

在这里插入图片描述

接下来就是ListView 适配器子项item布局:

order_item.xml:

在这里插入图片描述

OrderBean实体类

public class OrderBean implements Serializable {
/** * msg : 操作成功 * code : 200 * data : [{"searchValue":null,"createBy":null,"createTime":"2020-10-24 19:23:31","updateBy":null,"updateTime":null,"remark":null,"params":{},"orderNum":"60353861","id":1,"path":"三号线","start":"珠江新城","end":"广州北站","price":8,"userName":"张三","userTel":"12345611","userId":1,"status":0},{"searchValue":null,"createBy":null,"createTime":"2020-10-24 19:25:36","updateBy":null,"updateTime":null,"remark":null,"params":{},"orderNum":"60353873","id":2,"path":"三号线","start":"珠江新城","end":"大连北站","price":8,"userName":"张三","userTel":"12345611","userId":1,"status":0}] */ private String msg; private int code; private List
data; public String getMsg() {
return msg; } public void setMsg(String msg) {
this.msg = msg; } public int getCode() {
return code; } public void setCode(int code) {
this.code = code; } public List
getData() {
return data; } public void setData(List
data) {
this.data = data; } public static class OrderData {
/** * searchValue : null * createBy : null * createTime : 2020-10-24 19:23:31 * updateBy : null * updateTime : null * remark : null * params : {} * orderNum : 60353861 * id : 1 * path : 一号线 * start : 泰德大厦 * end : 大连北站 * price : 8 * userName : 张三 * userTel : 12345611 * userId : 1 * status : 0 */ private Object searchValue; private Object createBy; private String createTime; private Object updateBy; private Object updateTime; private Object remark; private String orderNum; private int id; private String path; private String start; private String end; private int price; private String userName; private String userTel; private int userId; private int status; public Object getSearchValue() {
return searchValue; } public void setSearchValue(Object searchValue) {
this.searchValue = searchValue; } public Object getCreateBy() {
return createBy; } public void setCreateBy(Object createBy) {
this.createBy = createBy; } public String getCreateTime() {
return createTime; } public void setCreateTime(String createTime) {
this.createTime = createTime; } public Object getUpdateBy() {
return updateBy; } public void setUpdateBy(Object updateBy) {
this.updateBy = updateBy; } public Object getUpdateTime() {
return updateTime; } public void setUpdateTime(Object updateTime) {
this.updateTime = updateTime; } public Object getRemark() {
return remark; } public void setRemark(Object remark) {
this.remark = remark; } public String getOrderNum() {
return orderNum; } public void setOrderNum(String orderNum) {
this.orderNum = orderNum; } public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getPath() {
return path; } public void setPath(String path) {
this.path = path; } public String getStart() {
return start; } public void setStart(String start) {
this.start = start; } public String getEnd() {
return end; } public void setEnd(String end) {
this.end = end; } public int getPrice() {
return price; } public void setPrice(int price) {
this.price = price; } public String getUserName() {
return userName; } public void setUserName(String userName) {
this.userName = userName; } public String getUserTel() {
return userTel; } public void setUserTel(String userTel) {
this.userTel = userTel; } public int getUserId() {
return userId; } public void setUserId(int userId) {
this.userId = userId; } public int getStatus() {
return status; } public void setStatus(int status) {
this.status = status; } public OrderData(String createTime, String orderNum) {
this.createTime = createTime; this.orderNum = orderNum; } }}

转载地址:http://bzacz.baihongyu.com/

你可能感兴趣的文章