【问题标题】:how to use json array list in custom adopter in android?如何在android的自定义适配器中使用json数组列表?
【发布时间】:2017-04-11 23:06:17
【问题描述】:

我想从android中的服务器调用一个json API:

第 1 步

我在一个 json 中有 2 个列表。(菜单和结果)

{
"page": 1, 
    "menus": [ { m1:"v1" },{ ... },..., "count_menus": 10],
    "results": [ { r1:"v1",r2:"v2" },{ ... },"count_results": 273 ]
, "total_count": 5450, "total_pages": 283 

}

问题一:首先,json结构是真的吗?

---------

我创建了一个MedicAPI.java 类:

public class MedicApi {

    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create())
                    .baseUrl("http://www.example.com/api/")
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

}

public interface MedicService {

    @GET("service/last.php")
    Call<LastMedic> getTopRatedMovies(
            @Query("api_key") String apiKey,
            @Query("language") String language,
            @Query("page") int pageIndex
    );

}

现在,我为此创建了一些模型:

public class LastMedic {

    @SerializedName("page")
    @Expose
    private Integer page;
    @SerializedName("results")
    @Expose
    private List<LastMedicResult> results = new ArrayList<LastMedicResult>();
    @SerializedName("menus")
    @Expose
    private List<LastMedicMenu> menus = new ArrayList<LastMedicMenu>();
    @SerializedName("total_counts")
    @Expose
    private Integer totalCounts;
    @SerializedName("total_pages")
    @Expose
    private Integer totalPages;


    public Integer getPage() {
        return page;
    }
    public void setPage(Integer page) {
        this.page = page;
    }
    public List<LastMedicResult> getResults() {
        return results;
    }
    public void setResults(List<LastMedicResult> results) {
        this.results = results;
    }
    public List<LastMedicMenu> getMenus() {
        return menus;
    }
    public void setMenus(List<LastMedicMenu> menus) {
        this.menus = menus;
    }
    public Integer gettotalCounts() {
        return totalCounts;
    }
    public void settotalCounts(Integer totalCounts) {
        this.totalCounts = totalCounts;
    }
    public Integer getTotalPages() {
        return totalPages;
    }
    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }

}

还有两个用于菜单和结果的模型,分别是 LastMedicMenuLastMedicResults

所以我认为我的代码对于 API 来说是完整的。

第 1 步,在另一个项目中工作


第二步

我使用this library adopter

这是我在 Dataserver.java

中的示例数据
public class DataServer {

    private DataServer() {

    }

    public static List<MultipleItem> getMultipleItemData() {

        List<MultipleItem> list = new ArrayList<>();



            for (int i = 0; i <= 5; i++) {
                thisCounter++;
                list.add(new MultipleItem(MultipleItem.IMG_TEXT, MultipleItem.IMG_TEXT_SPAN_SIZE_MIN,"menu"));
           }


        for (int i = 0; i <= 10; i++) {
            list.add(new MultipleItem(MultipleItem.SERVICE_LIST, MultipleItem.SERVICE_SPAN_SIZE));
        }

    }
}

public class MultipleItem implements MultiItemEntity {

    public static final int TEXT = 1;
    public static final int TEXT_SPAN_SIZE = 4;
    public static final int IMG = 2;
    public static final int IMG_SPAN_SIZE = 1;
    public static final int IMG_TEXT = 3;
    public static final int IMG_TEXT_SPAN_SIZE = 4;
    public static final int IMG_TEXT_SPAN_SIZE_MIN = 2;
    public static final int SERVICE_LIST = 4;
    public static final int SERVICE_SPAN_SIZE = 4;

    private int itemType;
    private int spanSize;


    public MultipleItem(int itemType, int spanSize, String content) {
        this.itemType = itemType;
        this.spanSize = spanSize;
        this.content = content;
    }

    public MultipleItem(int itemType, int spanSize) {
        this.itemType = itemType;
        this.spanSize = spanSize;
    }

    public int getSpanSize() {
        return spanSize;
    }

    public void setSpanSize(int spanSize) {
        this.spanSize = spanSize;
    }

    private String content;
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public int getItemType() {
        return itemType;
    }
}

第 2 步,适用于样本数据。

例如,我可以在 adobter 中将 XML 与此代码绑定:

protected void convert(BaseViewHolder helper, MultipleItem item) {
        switch (helper.getItemViewType()) {
            case MultipleItem.TEXT:
                helper.setText(R.id.tv, item.getContent());

第三步

现在,我想合并 Step1 和 Step2。

我的意思是我想使用 json 数据而不是示例数据。

例如:

for (int i = 0; i <= 5; i++) {
                    thisCounter++;
                    list.add(new MultipleItem(MultipleItem.IMG_TEXT, MultipleItem.IMG_TEXT_SPAN_SIZE_MIN,"menu"));
               }

我想在 json 中使用 menus 列表。

为了这个

for (int i = 0; i <= 10; i++) {
            list.add(new MultipleItem(MultipleItem.SERVICE_LIST, MultipleItem.SERVICE_SPAN_SIZE));
}

我想在 json 中使用 results 列表。


第 4 步 此代码是否适用于加载列表表单服务器?

callLastMedicApi().enqueue(new Callback<LastMedic>() {
            @Override
            public void onResponse(Call<LastMedic> call, Response<LastMedic> response) {


                List<LastMedicResult> results = fetchResults(response);
                List<LastMedicMenu> menus = fetchResults2(response);

            }

            @Override
            public void onFailure(Call<LastMedic> call, Throwable t) {
                t.printStackTrace();
                // 
            }
        });

private Call<LastMedic> callLastMedicApi() {
    return medicService.getTopRatedMovies(
            getString(R.string.my_api_key),
            "en_US",
            currentPage
    );
}

如果是,如何使用此代码和 DataServer 类和 MultipleItem 类?

我想可以这样做(例如):

protected void convert(BaseViewHolder helper, MultipleItem item) {
            switch (helper.getItemViewType()) {
                case MultipleItem.TEXT:
                    helper.setText(R.id.tv, item.getMenu(M1));

【问题讨论】:

    标签: android android-recyclerview android-adapter android-json


    【解决方案1】:
    public class DataServer {
    
        private DataServer() {
    
        }
    
        public static List<MultipleItem> getMultipleItemData(List<LastMedicResult> results,List<LastMedicMenu> menus) {
    
            List<MultipleItem> list = new ArrayList<>();
    
    
    
                for (int i = 0; i <= menus.size(); i++) {
                    thisCounter++;
                    list.add(new MultipleItem(MultipleItem.IMG_TEXT, MultipleItem.IMG_TEXT_SPAN_SIZE_MIN,"menu"));
               }
    
    
            for (int i = 0; i <= results.size(); i++) {
                list.add(new MultipleItem(MultipleItem.SERVICE_LIST, MultipleItem.SERVICE_SPAN_SIZE));
            }
    
        }
    }
    

    完成此操作后,请在响应中调用 getMultipleItemData

        callLastMedicApi().enqueue(new Callback<LastMedic>() {
                        @Override
                        public void onResponse(Call<LastMedic> call, Response<LastMedic> response) {
    
    
                            List<LastMedicResult> results = fetchResults(response);
                            List<LastMedicMenu> menus = fetchResults2(response);
    
    mRecyclerView = (RecyclerView) findViewById(R.id.YOUR_RECYCLERVIEW_ID);
                       final List<MultipleItem> dataList =     DataServer.getMultipleItemData(results,menus); //it will return a list and you can send this list in MultipleItemQuickAdapter
    
          /* i get this code from the library that you share above */
                final MultipleItemQuickAdapter multipleItemAdapter = new MultipleItemQuickAdapter(YOUR_ACTIVITY.this, dataList); // your datas.
                final GridLayoutManager manager = new GridLayoutManager(this, 4);
                mRecyclerView.setLayoutManager(manager);
                multipleItemAdapter.setSpanSizeLookup(new BaseQuickAdapter.SpanSizeLookup() {
                    @Override
                    public int getSpanSize(GridLayoutManager gridLayoutManager, int position) {
                        return data.get(position).getSpanSize();
                    }
                });
                mRecyclerView.setAdapter(multipleItemAdapter);
                        }
    
                        @Override
                        public void onFailure(Call<LastMedic> call, Throwable t) {
                            t.printStackTrace();
                            // 
                        }
                    });
    
            private Call<LastMedic> callLastMedicApi() {
                return medicService.getTopRatedMovies(
                        getString(R.string.my_api_key),
                        "en_US",
                        currentPage
                );
            }
    

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多