【问题标题】:issue in getting data in listview using get API calling android使用get API调用android在listview中获取数据的问题
【发布时间】:2018-09-03 10:13:01
【问题描述】:

在列表视图中获取 API 数据的问题

api 正在调用,但列表未显示在 listview 中,当我调试程序时,它运行到 call.enque 方法,在此行之后它在最后一行抛出时中断

我想在我的 Listview 中得到这个回复,但我遇到了我不知道我错在哪里的问题

这是我的 Get API 响应

{
"success": true,
"message": "",
"user": [
{
"id": 1,
"username": "Admin",
"email": "admin@gmail.com",
"role": "Administrator"
},
{
"id": 2,
"username": "Lawyer",
"email": "lawyer@gmail.com",
"role": "Lawyer"
},
{
"id": 3,
"username": "Driver",
"email": "driver@gmail.com",
"role": "Driver"
}
]
}

activity_main

  <ListView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/ls"/>

接口类 api.java

public interface api {
String BASE_URL = "https://efce0212.ngrok.io/api/";
@GET("user")
Call<List<User>> getHeroes();
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = findViewById(R.id.ls);
    getHeroes();
}

public void getHeroes() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(api.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    api api = retrofit.create(api.class);


    Call<List<User>> call = api.getHeroes();


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

            final String[] user = new String[userList.size()];

            for (int i = 0; i < userList.size(); i++) {


                user[i] = "Sucess:" + userList.get(i).getSucess() + "\n" + "message" + userList.get(i).getMessage() + "\n" + userList.get(i).getUserData();
            }

            listView.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, user));
        }

        @Override
        public void onFailure(Call<List<User>> call, Throwable t) {

            Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();

        }
    });
}
}

Pojo USER.JAVA

public class User {
private String sucess;
private String message;
public UserData[] userData;

//UserData  userData  = new UserData();

public User(String sucess, String message, UserData[] userData) {
    this.sucess = sucess;
    this.message = message;
    //this.userData = userData;
    this.userData = userData;
}

public String getSucess() {
    return sucess;
}

public String getMessage() {
    return message;
}

public UserData[] getUserData() {
    return userData;
}
}

UserData.class

public class UserData {
public String  id;
public String name;
public String email;
public String role;
}

【问题讨论】:

  • 请添加您遇到的错误/问题
  • @RavindraKushwaha 我没有收到任何错误,问题是 API 数据未显示在列表视图中
  • 你需要客户适配器或微调器
  • 不,我不需要微调器或自定义适配器,只需要列表中的数据
  • 从 final String[] 中移除 final user = new String[userList.size()];因为用 final 初始化后就不能修改了。

标签: android android-studio listview


【解决方案1】:

您需要在列表视图中添加一个 LinearLayout 管理器。

LinearLayoutManager layoutManager=new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
    listView.setLayoutManager(layoutManager);

【讨论】:

    【解决方案2】:

    据我所见

    {
    "success": true,
    "message": "",
    "user": [
    {
    "id": 1,
    "username": "Admin",
    "email": "admin@gmail.com",
    "role": "Administrator"
    },
    {
    "id": 2,
    "username": "Lawyer",
    "email": "lawyer@gmail.com",
    "role": "Lawyer"
    },
    {
    "id": 3,
    "username": "Driver",
    "email": "driver@gmail.com",
    "role": "Driver"
    }
    ]
    }
    

    您的回复是 User 对象,但正如我所见

    call.enqueue(new Callback&lt;List&lt;User&gt;&gt;()

    您期望 Users 的列表作为没有意义的响应。

    我希望将call 响应类型更改为User 可以修复它。像这样:

    Call<User> call = api.getHeroes();
    
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            ...
        }
    
        @Override
        public void onFailure(Call<User> call, Throwable t) {
    
           ...
    
        }
    });
    

    【讨论】:

    • 在此行中应用此错误后final List &lt;User&gt; userList = response.body(); 我应该写什么而不是此行
    • 您有一个 User 类型的对象,即您的 response.body() 。然后你可以随意使用response.body().getUserDate()UserData对象。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多