view的空指针异常,listview加载数据底部添加按钮

本文介绍如何在Android应用中实现ListView底部添加按钮,并通过按钮控制数据的分页加载,包括按钮布局设计、页面跳转功能及数据加载逻辑。

listview数据加载后底部添加按钮:

先写一个xml文件,里面添加按钮控件,如下listbutton。xml,按钮居中对齐的哦。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center_vertical|center_horizontal"
    android:layout_gravity="center_vertical|center_horizontal"
    android:orientation="horizontal" >
   
  <Button
     android:id="@+id/lastButton"
     android:layout_width="wrap_content"
     android:layout_height="30px"
     android:gravity="center_vertical"
     android:layout_marginTop="5px"
     android:text="上一页"
     android:onClick="lastPageDate"/>
 
  <TextView
      android:id="@+id/counTe"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:gravity="center_vertical"
      android:text=""
      />
 
  <Button
     android:id="@+id/nextButton"
     android:layout_width="wrap_content"
     android:layout_height="30px"
     android:layout_gravity="center_vertical"
     android:layout_marginTop="5px"
     android:layout_marginLeft="10px"
     android:text="下一页"
     android:onClick="nextPageDate"/>
</LinearLayout>

 

 

 

放listview的那个xml就不展示了,因为很简单,只是在界面里加一个listview。不过必须设置android:layout_width="fill_parent",否则按钮无法居中。

下面就是后台代码了。

MainActivity。java。

 

package com.example.dbconnectiontest;

/*必须引用apache.http相关类来创建HTTP连接*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.security.auth.PrivateCredentialPermission;

import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import com.example.dbconnectiontest.entity.people;
import com.example.dbconnectiontest.jsonto.JsonToList;

import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
/* 必须引用java.io与java.util相关类来读写文件*/

public class MainActivity extends Activity {

 private static final String TAG = "MainActivity";
 private static final String URL2 = "http://192.168.1.101:8080/BootStarpImage/getList.action";
 static int index = 1;//存放页码
 static int indexCount = 5;//存放总页码
 Button seButton,lastButton,nextButton;//获取数据按钮,上一页,下一页按钮
 TextView counTextView;//显示页码
 ListView lView;//listview
 View buView; //获取listview底部按钮的xml
 private int[] lay = new int[4];//存放实体类对象的text数组
 private List data = new ArrayList();//存放获取到的数据
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  seButton = (Button)findViewById(R.id.btnOne);
  seButton.setOnClickListener(new clicklist());
  lView = (ListView)findViewById(R.id.listview);
  /**
   * 在listview底部添加按钮
   */
  buView = getLayoutInflater().inflate(R.layout.listbutton, null);
  lView.addFooterView(buView);
  
  /**
   * 必须放在lview后面,先添加listview才能找到listview上的控件,否则抛出空指针异常
   */
  lastButton = (Button)findViewById(R.id.lastButton);
  nextButton = (Button)findViewById(R.id.nextButton);
  counTextView = (TextView)findViewById(R.id.counTe);
 }
 


/**
 {"people":[{"firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},{ "firstName": "Elliotte","lastName":"Harold", "email": "cccc" }]}
 */
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
 
 class clicklist implements OnClickListener{

  @Override
  public void onClick(View v) {
   String urlString = URL2 + "?index=1";
   String string = httpToServiceSelectData(urlString);
   listToData(string);
   /**
    * 查询总页码
    */
//   urlString = "";
//   string = httpToServiceSelectData(urlString);
      setPageButton(v);此处必须传入v及view,否则后续报出关于view的空指针
  }

 }

 /**
  * 请求数据 传入一个url
  * @param urlString
  */
 private String httpToServiceSelectData(String urlString) {
  HttpClient client=new DefaultHttpClient(); 
        //创建一个GET请求
        HttpGet httpGet=new HttpGet(urlString);
        //向服务器发送请求并获取服务器返回的结果  
        HttpResponse response;
  try {
   response = client.execute(httpGet);
   int staCode = response.getStatusLine().getStatusCode();
   if(staCode == 200){
    //返回的结果可能放到InputStream,http Header中等。
    String string  = EntityUtils.toString(response.getEntity(),HTTP.UTF_8);
    return string;//返回读取到的数据,用其它方法进行转换成实体
   }else if(staCode == 404)
    Toast.makeText(getApplicationContext(), "服务器异常,请稍候再试。", Toast.LENGTH_SHORT).show();
   else if (staCode == 500)
    Toast.makeText(getApplicationContext(), "读取数据失败,请稍候查询。", Toast.LENGTH_SHORT).show();
  } catch (ClientProtocolException e1) {
   e1.printStackTrace();
  } catch (IllegalStateException e1) {
   e1.printStackTrace();
  } catch (IOException e1) {
   e1.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
 
 /**
  * 将查询到的数据添加到listview中
  * @param string 返回的字符串(转成过的)
  */
 private void listToData(String string) {
  JsonToList jToList = new JsonToList();
  List<people> li = jToList.returnListView(string);此处调用的是一个java类中的方法,自己写的,代码就几行。要的在下面
  for (people ent : li) {
   Map<String, String> map = new HashMap<String, String>();
   map.put("id", ent.getId()+"");
   map.put("firstName", ent.getFirstName());
   map.put("lastName", ent.getLastName());
   map.put("email", ent.getEmail());
   data.add(map);
  }
  SimpleAdapter sAdapter = new SimpleAdapter(MainActivity.this, data, R.layout.listview, new String[]{"id","firstName","lastName","email"}, new int[]{R.id.ids,R.id.firstName,R.id.lastName,R.id.email});
  sAdapter.notifyDataSetChanged();//增加或删除操作进行后调用该方法,更改listview中的数据,否则会一直往listview下方添加
  lView.setAdapter(sAdapter);
 }
 
 //设置页码信息,以及按钮的是否可点击
 private void setPageButton(View view) {
  counTextView.setText(index + "/" + indexCount);//设置页码数
  if(index == 1)
   lastButton.setClickable(false);
  else
   lastButton.setClickable(true);
  if(index == indexCount)
   nextButton.setClickable(false);
  else
   nextButton.setClickable(true);
 }
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
 }
 
 //点击过按钮过后,加载数据时按钮不可用
 public void setButtonAll(Button lastButton,Button nextButton) {
  lastButton.setClickable(false);
  nextButton.setClickable(false);
 }
 /**
  * 上一页按钮点击事件
  * @param view
  */
 public void lastPageDate(View view) {
//  setButtonAll(lastButton,nextButton);
  if (index > 1) {
   index--;
//   String url = "";
//   String string = httpToServiceSelectData(url);
//   listToData(string);//设置数据
   setPageButton(view);
  }
 }
 
 /**
  * 下一页按钮点击事件
  * @param view
  */
 public void nextPageDate(View view) {
//  setButtonAll(lastButton,nextButton);
  if (index < indexCount) {
   index++;
//   String url = "";
//   String string = httpToServiceSelectData(url);
//   listToData(string);//设置数据
   Toast.makeText(MainActivity.this, index+"", Toast.LENGTH_SHORT).show();//此处的index必须+“”,转换为字符串,否则报错
   System.out.println(index++);
   setPageButton(view);
  }
 }
}


 

 

 

JsonToList。java

 

public class JsonToList {
 public List<people> returnListView(String string) {
  java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<people>>(){}.getType();
  Gson gson = new Gson();
  List<people> list = gson.fromJson(string, type);
  return list;
 }
}

 

 

 

下面来看一下关于view的错误。例如上面的setPageButton(View view)方法变为setPageButton()就会报错。

 

package com.jd.projects.wlw.shuhai; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.FrameLayout; import android.widget.GridLayout; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.DefaultRetryPolicy; import com.android.volley.NoConnectionError; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.ServerError; import com.android.volley.TimeoutError; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import com.jd.projects.wlw.R; public class Shuhai extends AppCompatActivity { private TextView nAme; private ListView dateList; private String currentStationId; private String stationName; // private static final boolean TEST_MODE = false; // private static final String TEST_STATION_ID = "20220811001"; // private static final String TEST_STATION_NAME = "测试监测点"; private GridLayout imageGrid; private ProgressBar progressBar; private RequestQueue requestQueue; private static final String REQUEST_TAG = "ShuhaiRequest"; private String currentDate; private Button btnYear, btnMonth; private int currentYear; private int currentMonth; private Button deviceLocationBtn; private Button spButton; private ZoomImageView1 fullImageView; // 用于全屏显示 private FrameLayout fullscreenContainer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.shuhai); imageGrid = (GridLayout) findViewById(R.id.image_grid); fullscreenContainer = (FrameLayout) findViewById(R.id.fullscreen_container); fullImageView = (ZoomImageView1) findViewById(R.id.fullscreen_imageview); // Log.d("GkdActivity", "Activity created"); } catch (Exception e) { // Log.e("GkdActivity", "Error setting content view", e); Toast.makeText(this, "加载界面失败", Toast.LENGTH_SHORT).show(); finish(); return; } // 初始化WebView initFullscreenContainer(); // 控件初始化区域 View fanHui = findViewById(R.id.fanHui); fanHui.setOnClickListener(v -> finish()); nAme = (TextView) findViewById(R.id.nAme); dateList = (ListView) findViewById(R.id.date_list); imageGrid = (GridLayout) findViewById(R.id.image_grid); progressBar = (ProgressBar) findViewById(R.id.progressBar); // 新增设备定位按钮初始化 Button deviceLocationBtn = (Button) findViewById(R.id.device_location); deviceLocationBtn.setOnClickListener(v -> { Intent resultIntent = new Intent(); resultIntent.putExtra("action", "show_location"); resultIntent.putExtra("site_id", currentStationId); setResult(RESULT_OK, resultIntent); finish(); }); // Volley请求队列初始化 requestQueue = Volley.newRequestQueue(this); // 年月选择初始化 btnYear = (Button) findViewById(R.id.btn_year); btnMonth = (Button) findViewById(R.id.btn_month); initYearMonthSelection(); // 数据处理 handleIntentData(); // Log.d("GkdActivity", "Station ID: " + currentStationId); // Log.d("GkdActivity", "Station Name: " + stationName); // 名称显示处理 if (stationName != null) { nAme.setText(stationName); } else { nAme.setText("监测点信息"); } // 加载初始数据 loadDatesForCurrentMonth(); spButton = findViewById(R.id.Sp); spButton.setOnClickListener(v -> { // 创建跳转到ShuhaiSPActivity的Intent Intent intent = new Intent(Shuhai.this, ShuhaiSp.class); // 传递当前监测点信息 if (currentStationId != null) { intent.putExtra("nsiteid", currentStationId); } if (stationName != null) { intent.putExtra("sitealiasname", stationName); } // 添加额外数据(如果需要) intent.putExtra("currentDate", currentDate); intent.putExtra("currentYear", currentYear); intent.putExtra("currentMonth", currentMonth); // 启动新Activity startActivity(intent); }); } private void initFullscreenContainer() { // 设置关闭全屏的按钮事件 findViewById(R.id.close_fullscreen).setOnClickListener(v -> { fullscreenContainer.setVisibility(View.GONE); }); } private void initYearMonthSelection() { Calendar calendar = Calendar.getInstance(); currentYear = calendar.get(Calendar.YEAR); currentMonth = calendar.get(Calendar.MONTH) + 1; // 转换为1-12格式 updateYearMonthButtons(); btnYear.setOnClickListener(v -> showYearPicker()); btnMonth.setOnClickListener(v -> showMonthPicker()); } private void updateYearMonthButtons() { btnYear.setText(String.valueOf(currentYear)); btnMonth.setText(String.format("%02d", currentMonth)); } private void showYearPicker() { final List<Integer> years = new ArrayList<>(); int startYear = currentYear - 9; int endYear = currentYear + 9; for (int i = startYear; i <= endYear; i++) years.add(i); new AlertDialog.Builder(this) .setTitle("选择年份") .setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, years), (dialog, which) -> { currentYear = years.get(which); updateYearMonthButtons(); loadDatesForCurrentMonth(); }) .show(); } private void showMonthPicker() { new AlertDialog.Builder(this) .setTitle("选择月份") .setItems(new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}, (dialog, which) -> { currentMonth = which + 1; updateYearMonthButtons(); loadDatesForCurrentMonth(); }) .show(); } private void loadDatesForCurrentMonth() { try { // 使用动态获取的站点ID String deviceCode = URLEncoder.encode(currentStationId, "UTF-8"); Calendar cal = Calendar.getInstance(); cal.set(currentYear, currentMonth - 1, 1, 0, 0, 0); String startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime()); cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); String endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime()); String url = "http://nyzbwlw.com/situation/http/device/mouse/getMouseList" + "?deviceCode=" + deviceCode + "&startTime=" + URLEncoder.encode(startTime, "UTF-8") + "&endTime=" + URLEncoder.encode(endTime, "UTF-8") + "&size=10000"; progressBar.setVisibility(View.VISIBLE); JsonObjectRequest request = new JsonObjectRequest( Request.Method.GET, url, null, this::handleDateResponse, this::handleDateError); request.setRetryPolicy(new DefaultRetryPolicy(15000, 3, 1.5f)); requestQueue.add(request); } catch (Exception e) { progressBar.setVisibility(View.GONE); Toast.makeText(this, "时间参数错误", Toast.LENGTH_SHORT).show(); } } private void handleIntentData() { Intent intent = getIntent(); if (intent != null) { currentStationId = intent.getStringExtra("nsiteid"); stationName = intent.getStringExtra("sitealiasname"); // Log.d("GkdActivity", "Received nsiteid: " + currentStationId); // Log.d("GkdActivity", "Received sitealiasname: " + stationName); if (currentStationId == null || currentStationId.isEmpty()) { Toast.makeText(this, "未获取到监测点ID", Toast.LENGTH_SHORT).show(); setResult(RESULT_CANCELED); supportFinishAfterTransition(); return; } } else { Toast.makeText(this, "未获取到启动参数", Toast.LENGTH_SHORT).show(); finish(); } } private void handleDateResponse(JSONObject response) { progressBar.setVisibility(View.GONE); try { if (!response.has("code") || response.getInt("code") != 100) { handleDataError("服务器响应异常"); return; } JSONObject data = response.optJSONObject("data"); if (data == null || !data.has("list")) { handleDataError("数据结构异常"); return; } Set<String> dateSet = new HashSet<>(); JSONArray list = data.getJSONArray("list"); for (int i = 0; i < list.length(); i++) { String time = list.getJSONObject(i).optString("collectionTime", "") .replace("T", " "); // 处理可能存在的ISO格式时间 if (time.length() >= 10) { dateSet.add(time.substring(0, 10)); } } List<String> dates = new ArrayList<>(dateSet); Collections.sort(dates, Collections.reverseOrder()); dateList.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dates)); dateList.setOnItemClickListener((parent, view, position, id) -> { currentDate = dates.get(position); loadImages(); }); if (!dates.isEmpty()) { currentDate = dates.get(0); loadImages(); } } catch (JSONException e) { handleDataError("数据格式错误"); } } private void loadImages() { progressBar.setVisibility(View.VISIBLE); try { String startTime = currentDate + " 00:00:00"; String endTime = currentDate + " 23:59:59"; String url = "http://nyzbwlw.com/situation/http/device/mouse/getMouseList" + "?deviceCode=" + URLEncoder.encode(currentStationId, "UTF-8") + "&startTime=" + URLEncoder.encode(startTime, "UTF-8") + "&endTime=" + URLEncoder.encode(endTime, "UTF-8"); JsonObjectRequest request = new JsonObjectRequest( Request.Method.GET, url, null, this::handleImageResponse, this::handleImageError); request.setRetryPolicy(new DefaultRetryPolicy(15000, 3, 1.5f)); requestQueue.add(request); } catch (UnsupportedEncodingException e) { progressBar.setVisibility(View.GONE); Toast.makeText(this, "时间参数错误", Toast.LENGTH_SHORT).show(); } } private void handleImageResponse(JSONObject response) { progressBar.setVisibility(View.GONE); try { if (response.getInt("code") == 100) { JSONArray list = response.getJSONObject("data").getJSONArray("list"); List<String> imageUrls = new ArrayList<>(); List<String> imageTimes = new ArrayList<>(); for (int i = 0; i < list.length(); i++) { JSONObject item = list.getJSONObject(i); imageUrls.add(item.getString("pictureUrl")); String rawTime = item.optString("collectionTime", ""); imageTimes.add(rawTime.substring(11, 19)); } // 使用新的适配器方式 updateImageGrid(imageUrls, imageTimes); } } catch (JSONException e) { handleDataError("图片数据解析失败"); } } // 替换RecyclerView为动态添加视图 private void updateImageGrid(List<String> imageUrls, List<String> imageTimes) { imageGrid.removeAllViews(); // 清除旧视图 imageGrid.setColumnCount(2); // 2列网格 int spacing = getResources().getDimensionPixelSize(R.dimen.grid_spacing); int availableWidth = getResources().getDisplayMetrics().widthPixels - getResources().getDimensionPixelSize(R.dimen.left_nav_width); // 新计算公式:总可用宽度 - 4个间隔(左右各1 + 中间2) int imageSize = (availableWidth - spacing * 4) / 2; int textHeight = (int) (30 * getResources().getDisplayMetrics().density); for (int i = 0; i < imageUrls.size(); i++) { View itemView = LayoutInflater.from(this).inflate(R.layout.grid_item_image, null); ImageView imageView = (ImageView) itemView.findViewById(R.id.image_view); TextView fileNameText = (TextView) itemView.findViewById(R.id.file_name); String displayTime = imageTimes.get(i) != null ? imageTimes.get(i) : "--:--:--"; fileNameText.setText(displayTime); // 设置图片大小 imageView.getLayoutParams().width = imageSize; imageView.getLayoutParams().height = imageSize; // 使用Glide加载图片并添加错误处理 final String url = imageUrls.get(i); Glide.with(this) .load(url) .override(imageSize, imageSize) .centerCrop() .placeholder(R.drawable.placeholder) .error(R.drawable.error_image) .into(imageView); // 设置点击事件 itemView.setOnClickListener(v -> showFullscreenImage(url)); // 添加视图到网格 // GridLayout.Spec rowSpec = GridLayout.spec(i / 2); // GridLayout.Spec colSpec = GridLayout.spec(i % 2); GridLayout.LayoutParams params = new GridLayout.LayoutParams( GridLayout.spec(i / 2), GridLayout.spec(i % 2) ); params.width = imageSize; params.height = imageSize + textHeight; params.setMargins(spacing, spacing, spacing, spacing); imageGrid.addView(itemView, params); } } private void handleDateError(VolleyError error) { progressBar.setVisibility(View.GONE); handleNetworkError(error, "日期加载失败"); } private void handleImageError(VolleyError error) { progressBar.setVisibility(View.GONE); handleNetworkError(error, "图片加载失败"); } private void handleNetworkError(VolleyError error, String prefix) { String message = prefix + ": "; if (error instanceof TimeoutError) { message += "请求超时(请检查网络)"; } else if (error instanceof NoConnectionError) { message += "网络未连接"; } else if (error instanceof ServerError) { message += "服务器错误(HTTP " + error.networkResponse.statusCode + ")"; } else if (error instanceof AuthFailureError) { message += "认证失败(请检查权限)"; } else if (error instanceof ParseError) { message += "数据解析异常(请检查API格式)"; } else { message += "未知错误"; } Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } private void handleDataError(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } private void showFullscreenImage(String imageUrl) { fullscreenContainer.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE); // fullImageView.resetMatrix(); // 使用Glide加载全屏图片 Glide.with(this) .load(imageUrl) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { progressBar.setVisibility(View.GONE); // 显示错误图片 fullImageView.setImageResource(R.drawable.error_image); return true; // 消费异常事件 } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { // 延迟执行确保视图已布局 fullImageView.post(() -> { fullImageView.resetMatrix(); progressBar.setVisibility(View.GONE); }); return false; } }) .error(R.drawable.error_image) .into(fullImageView); } public void closeFullscreen(View view) { fullscreenContainer.setVisibility(View.GONE); } @Override protected void onStop() { super.onStop(); if (requestQueue != null) { requestQueue.cancelAll(REQUEST_TAG); } } } 依据上述代码解决报错:Incompatible types. Found: 'android.view.View', required: 'android.widget.Button'
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值