【问题标题】:How to add data into Spinner in android如何在android中将数据添加到Spinner
【发布时间】:2017-07-30 06:29:25
【问题描述】:

在我的应用程序中,我想将一些数据从服务器显示到 Spinner。
对于 Spinner,我使用这个库:https://github.com/ganfra/MaterialSpinner
我的 Json:

"stars": [
      {
        "id": 105076,
        "name": "Eleanor Tomlinson",
        "character": null,
        "imageUrl": "http://example.com/cpanel/uploads/Celebrities/105076/thumb2-SK4MPEGW09.jpg",
        "userReview": ""
      },
      {
        "id": 10127,
        "name": "Aidan Turner",
        "character": null,
        "imageUrl": "http://example.com/cpanel/uploads/Celebrities/10127/thumb2-KL9G4TNGW2.jpg",
        "userReview": ""
      },
      {
        "id": 21340,
        "name": "Gabriella Wilde",
        "character": null,
        "imageUrl": "http://example.com/cpanel/uploads/Celebrities/21340/thumb2-UD5HJ2EICN.jpg",
        "userReview": ""
      }
    ]

为了连接到服务器,我使用Retrofit 库并编写以下代码:

final SerialDetailSendData sendData = new SerialDetailSendData();
sendData.setSeriesID(serialID);

InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
Call<SeriesDetailResponse> call = api.getSeriesDetail(sendData);

call.enqueue(new Callback<SeriesDetailResponse>() {
    @Override
    public void onResponse(Call<SeriesDetailResponse> call, Response<SeriesDetailResponse> response) {
        if (response.body().getData() != null) {
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.spinner_hint_item,
                    ???);
            adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
            SerialReview_CastSpinner.setAdapter(adapter);

            SerialReview_CastProgress.hide();
        }
    }

    @Override
    public void onFailure(Call<SeriesDetailResponse> call, Throwable t) {
    }
});

但我不知道如何将星星类中的名称添加到 ArrayAdapter 以在 Spinner 中设置。

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.spinner_hint_item,
                    ???);

【问题讨论】:

标签: android android-spinner android-adapter


【解决方案1】:

首先创建从api中检索数据的ArrayList

ArrayList<String> arrayList = new ArrayList<String>();

arrayList.add("Item1");
arrayList.add("Item2");
arrayList.add("Item3");

并创建一个ArrayAdapter的数据。

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> (this,android.R.layout.simple_spinner_dropdown_item, arrayList);
spinner.setAdapter(arrayAdapter);

【讨论】:

  • 你有 pojo 类的权利。 arrayList.add().response.getData().getItem ... 类似这样的东西。
  • @Kir 完整代码?您无需改造即可将数据添加到适配器
  • @Kir 关注此:stackoverflow.com/questions/33936573/…。我想这肯定会对你有所帮助。
【解决方案2】:

您应该只在回调中添加适配器,而不是创建适配器,因为它在对象创建中效率较低。

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_dropdown_item);
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(adapter);

call.enqueue(new Callback<SeriesDetailResponse>() {
    @Override
    public void onResponse(Call<SeriesDetailResponse> call, Response<SeriesDetailResponse> response) {
        SeriesDetailResponse body = response.body();
        List<Star> stars = body.getStars();

        adapter.clear();
        for (Star star : stars) {
            adapter.add(star.toString());
        }

        progress.hide();
    }

如果您有 List&lt;String&gt;ArrayAdapter&lt;String&gt; 或使用 ArrayAdapter&lt;Star&gt;,则可以使用 adapter.addAll() 缩短该循环

【讨论】:

    【解决方案3】:

    试试这个代码:

        final SerialDetailSendData sendData = new SerialDetailSendData();
        sendData.setSeriesID(serialID);
    
        InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
        Call<SeriesDetailResponse> call = api.getSeriesDetail(sendData);
    
        call.enqueue(new Callback<SeriesDetailResponse>() {
            @Override
            public void onResponse(Call<SeriesDetailResponse> call, Response<SeriesDetailResponse> response) {
                if (response.body().getData() != null) {
                    ArrayList<String> arrayList = new ArrayList<String>();
                    for (int i = 0; i < response.body().getData().getStars().size(); i++) {
                        arrayList.add(response.body().getData().getStars().get(i).getName());
                    }
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.layout.spinner_hint_item, arrayList);
                    adapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
                    SerialReview_CastSpinner.setAdapter(adapter);
    
                    SerialReview_CastProgress.hide();
                }
            }
    
            @Override
            public void onFailure(Call<SeriesDetailResponse> call, Throwable t) {
            }
        });
    

    【讨论】:

    • 您不能多次致电response.body()
    • @cricket_007,为什么是我的朋友?一次调用 response.body() 获取大小,两次调用获取明星名称
    • 因为根据 OkHTTP 和改造文档,它会抛出一个错误。
    • 我不再使用此代码,没有显示任何错误,并且工作得很好!
    • 好吧,也许是string()github.com/square/okhttp/issues/1240 还是!多次调用同一个方法获取响应体是没有意义的
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多