0

나는 안드로이드에서 서버에서 JSON API를 호출 할 :안드로이드의 사용자 지정 응용 프로그램에서 json 배열 목록을 사용하는 방법은 무엇입니까?

enter image description here

STEP1

에게 내가 한 JSON에서이 목록을 가지고 (메뉴 및 결과)

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

. }

질문 1 : 첫째, 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; 
    } 

} 

또한 두 모델을 메뉴 및 결과 그래서 나는 내 코드는 API에 대한 완전한 생각LastMedicResults

을 LastMedicMenu.

1 단계,


STEP2

내가 this library adopter를 사용하는 다른 프로젝트에서 작동합니다.

이, 2 단계

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; 
    } 
} 

Dataserver.java내 샘플 데이터입니다 샘플 데이터를 사용할 수 있습니다. 예를 들어

나는 adobter이 코드와 XML을 결합 할 수 있습니다

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

STEP3

을 지금, 1 단계와 2 단계를 병합 할 수 있습니다.

나는 샘플 데이터 대신 json 데이터를 사용하고 싶다.이것에 대한 예를 들어

:

내가 JSON에 메뉴 목록을 사용할
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)); 
} 

에 대한

는 JSON에서
목록을 발생합니다.


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 클래스는 어떻게 사용할 수 있습니까?

I (예를 들어)이 작업을 수행 할 수 있습니다 원하는 :

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

답변

0
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 
      ); 
     }