gpt4 book ai didi

android - retrofit2 从mysql中获取数据并显示在listview上

转载 作者:行者123 更新时间:2023-11-30 22:04:49 25 4
gpt4 key购买 nike

我正在尝试在服务器端使用 Retrofit2 和 PHP 从 MySQL 获取数据。在 textview 上显示没有问题,然后我尝试在 listview 上显示,但我总是出错。有人可以帮我解决吗?你能解释一下如何使用 listviewArrayAdapter 吗?

主要 Activity

public class MainActivity extends AppCompatActivity {

EditText editName, editAddress;
//TextView textDetails;
Button btnGetData, btnInsertData;
private ProgressDialog pDialog;
String[] details = {"asd"};
ListView list;
ArrayAdapter<String> add;
//ArrayAdapter add = new ArrayAdapter<String> (this,R.layout.datalist,details);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//textDetails = (TextView)findViewById(R.id.textView);
editName = (EditText)findViewById(R.id.editName);
editAddress = (EditText)findViewById(R.id.editAdress);
btnGetData = (Button)findViewById(R.id.btnGetData);
btnInsertData = (Button)findViewById(R.id.btnInsert);
pDialog = new ProgressDialog(this);
pDialog.setMessage("Please wait.....");
pDialog.setCancelable(false);

getPeopleDetails();
add = new ArrayAdapter<String> (this,R.layout.datalist,details);
//textDetails.setText(details);
list = (ListView)findViewById(R.id.list);
list.setAdapter(add);

btnGetData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getPeopleDetails();

}
});
btnInsertData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setStudentDetails();
}
});
}

private void getPeopleDetails(){
showpDialog();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.101/")
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService service = retrofit.create(APIService.class);

Call<List<Student>> call = service.getPeopleDetails();

call.enqueue(new Callback<List<Student>>() {
@Override
public void onResponse(Call<List<Student>> call, Response<List<Student>> response) {
List<Student> students = response.body();

for (int i = 0 ; i < students.size(); i++){
String name = students.get(i).getName();
String address = students.get(i).getAddress();
details[i]="nama : "+name;
}
//hidepDialog();
//ArrayAdapter add = new ArrayAdapter<String> (this,R.layout.datalist,details);
list.setAdapter(add);

hidepDialog();
//return;
//Toast.makeText(MainActivity.this,details,Toast.LENGTH_LONG).show();
}

@Override
public void onFailure(Call<List<Student>> call, Throwable t) {
hidepDialog();
Toast.makeText(MainActivity.this,"ora metu opo2",Toast.LENGTH_LONG).show();
}
});
}

private void setStudentDetails(){
showpDialog();

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.101")
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService service = retrofit.create(APIService.class);
Student student = new Student();
student.setName(editName.getText().toString());
student.setAddress(editAddress.getText().toString());
Call<Student> call = service.insertStudentInfo(student.getName(),student.getAddress(),"081805854466" );
call.enqueue(new Callback<Student>() {
@Override
public void onResponse(Call<Student> call, Response<Student> response) {
hidepDialog();
Toast.makeText(MainActivity.this,"insert data ok",Toast.LENGTH_LONG).show();
}

@Override
public void onFailure(Call<Student> call, Throwable t) {
hidepDialog();
Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();
}
});
}
private void showpDialog(){
if(!pDialog.isShowing())
pDialog.show();
}

private void hidepDialog(){
if (pDialog.isShowing())
pDialog.hide();
}
}

API服务

public interface APIService {
@GET("student/list.php")
Call<List<Student>> getPeopleDetails();

@FormUrlEncoded
@POST("student/insertst.php")
Call<Student> insertStudentInfo(@Field("name") String name, @Field("address") String address, @Field("mobile") String mobile);
}

public class Student {
private String name, address;
private String mobile;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getMobile() {
return mobile;
}

public void setMobile(String mobile) {
this.mobile = mobile;
}
}

Activity 主线

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.idabdull.retrofit_try.MainActivity"
android:orientation="vertical">

<Button
android:text="Get Data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnGetData" />

<ListView
android:layout_width="match_parent"
android:layout_height="275dp"
android:id="@+id/list" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text="Name"
android:ems="10"
android:id="@+id/editName" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:text="Address"
android:ems="10"
android:id="@+id/editAdress" />

<Button
android:text="Insert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnInsert" />
</LinearLayout>

详细信息.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:id="@+id/label"
android:padding="10dip"
android:textSize="16dip"
android:textStyle="bold">
</TextView>

和错误

java.lang.ArrayIndexOutOfBoundsException: length=1; index=-1
at com.example.idabdull.retrofit_try.MainActivity$3.onResponse(MainActivity.java:94)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5264)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
I/Process: Sending signal. PID: 23765 SIG: 9

最佳答案

字符串数组中的问题。在 java 中,n 数组是一个容器对象,它包含固定数量 的单一类型的值。这意味着您不能在初始化后更改其长度,就像您在方法中尝试做的那样。在你的例子中

String[] details = {"asd"}; // details.length is 1

您必须在 onResponse 方法中初始化您的数组,如下所示

  @Override
public void onResponse(Call<List<Student>> call, Response<List<Student>> response) {
List<Student> students = response.body();
details = new String[students.size()]; // here you know lenght of needed array

for (int i = 0 ; i < students.size(); i++){
String name = students.get(i).getName();
String address = students.get(i).getAddress();
details[i]="nama : "+name;
}
// your code
}

关于android - retrofit2 从mysql中获取数据并显示在listview上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42139575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com