【问题标题】:How to Load Json in Endless Recycler Veiw with Retrofit如何使用 Retrofit 在 Endless Recyclerview 中加载 Json
【发布时间】:2016-08-25 17:51:24
【问题描述】:

我尝试用我的 Json Response 实现 Endless Recycler View。

这是我的 Json 回复 Link

我使用 jsonschema2pojo.org 生成我的模型,并成功将数据加载到我的 recyclerview 中。

但我需要实现无尽的回收器视图:

这是我的 RecyclerAdapter :

public class AparatAdapter extends RecyclerView.Adapter<AparatAdapter.ViewHolder> {

    private Context context;
    private ArrayList<Categoryvideo> categoryVideos;

    //=============================constructor
    public AparatAdapter(Context context, ArrayList<Categoryvideo> categoryVideos) {
        this.context = context;
        this.categoryVideos = categoryVideos;
    }
    //=============================viewholder
    public class ViewHolder extends RecyclerView.ViewHolder{
        private TextView txtTitle ,txtCount ,txtSender ,txtDate;
        private ImageView imgRow;
        public ViewHolder(View itemView) {
            super(itemView);
            txtTitle = (TextView)itemView.findViewById(R.id.txt_title_row);
            txtCount = (TextView)itemView.findViewById(R.id.txt_count_dynamic_row);
            txtSender = (TextView)itemView.findViewById(R.id.txt_sender_dynamic_row);
            txtDate = (TextView)itemView.findViewById(R.id.txt_date_dynamic_row);
            imgRow = (ImageView)itemView.findViewById(R.id.img_row);
        }
    }

    //================================oncreateviewholder

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent,false);
        return new ViewHolder(view);
    }

    //================================= onbindviewholder

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.txtTitle.setText(categoryVideos.get(position).getTitle());
        holder.txtCount.setText(categoryVideos.get(position).getVisitCnt().toString());
        holder.txtSender.setText(categoryVideos.get(position).getSenderName());
        holder.txtDate.setText(categoryVideos.get(position).getSdate().toString());
        Glide.with(holder.itemView.getContext()).load(categoryVideos.get(position).getSmallPoster())
                .into(holder.imgRow);
    }

    //==================================getitemcount

    @Override
    public int getItemCount() {
        return categoryVideos.size();
    }
}

这是我通过改造加载 json 的活动:

public class SargarmiActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private AparatAdapter adapter;
    private LinearLayoutManager layoutManager;
    private ArrayList<Categoryvideo> categoryvideos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sargarmi);
        initViews();
    }
    //=================================================

    private void initViews() {
        recyclerView = (RecyclerView) findViewById(R.id.recycler_sargarmi);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(SargarmiActivity.this);
        recyclerView.setLayoutManager(layoutManager);
        sendRequest();
    }

    //=================================================
    private void sendRequest() {
        recyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(layoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                loadMore();
            }
        });
        getData();
    }



    //=======================================================
    private void getData() {
        //1
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.aparat.com/etc/api/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        //2
        ApiInterface request = retrofit.create(ApiInterface.class);

        //3
        Call<JSONResponse> call = request.getJsonResponse();

        //4
        call.enqueue(new Callback<JSONResponse>() {
            @Override
            public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {
                if (response.isSuccessful()) {
                    JSONResponse jsonResponse = response.body();
                    categoryvideos = new ArrayList<>(jsonResponse.getCategoryvideos());
                    adapter = new AparatAdapter(SargarmiActivity.this, categoryvideos);
                    recyclerView.setAdapter(adapter);

                } else {
                    Toast.makeText(SargarmiActivity.this, "Error darim else onresponse", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<JSONResponse> call, Throwable t) {
                Toast.makeText(SargarmiActivity.this, "Error darim onFailure()", Toast.LENGTH_SHORT).show();
            }
        });
    }

    //=============== Load more Endless =====================
    private void loadMore() {

    }
}

正如您在 json 中看到的那样,我的分页 url 嵌入在 ui 对象中。而且我不知道应该在我的活动中的 loadmore() 方法中写什么。

【问题讨论】:

    标签: android json pagination retrofit2


    【解决方案1】:

    当你下载categoryvideos的初始加载时,还有一个元素叫做:pagingForward。这包含供您下载接下来 20 个项目的 URL。

    所以你想做的是:

    1. 下载第一个视频时,获取 pagingForward 值 并将其存储在某个地方。

    2. 当您调用 loadMore() 时,您会使用 Retrofit 进行另一次下载 带有网址。

    3. Retrofit 将下载对象,您将获得另一个 pagingForward 网址将指向接下来的 20 个项目。

    4. 这可以继续进行,直到没有更多对象可以获取 (不确定API如何响应,您需要检查 编写 API 的人)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-08
      • 2016-03-25
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2013-08-07
      • 2017-11-20
      • 2016-03-29
      相关资源
      最近更新 更多