【问题标题】:retrofit JSON array to recyclerview将 JSON 数组改造为 recyclerview
【发布时间】:2017-08-02 06:56:17
【问题描述】:

我有这样的 JSON 响应

[{"id":94973,"slug":"la-liga-real-betis-1-1-barcelona-29-januari-2017","type":"post"},{"id":94957,"slug":"fa-chelsea-4-0-brentford-28-januari-2017","type":"post"},{"id":94944,"slug":"serie-a-ac-milan-1-2-napoli-22-januari-2017","type":"post"},{"id":94663,"slug":"boullier-soroti-performa-mclaren-musim-ini","type":"post"},{"id":94660,"slug":"balotelli-tawarkan-diri-ke-sassuolo","type":"post"}]

我想通过改造来通过这个 我已经检查过从 json 获取数据没有问题,但是我的 recyclerview 没有显示任何数据。我认为我将响应传递给 arraylist 然后适配器是错误的。

我的响应课

public class EditorFragment extends Fragment {

private RecyclerView recyclerView;
private ArrayList<Coba> data;
//private List<Coba> tes;
private MyAdapter adapter;


public EditorFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    loadJSON();
}


private void loadJSON(){
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://www.opinianda.com/wp-json/wp/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    RequestSumbol request = retrofit.create(RequestSumbol.class);
    Call<List<Coba>> call = request.getPostDet();
    call.enqueue(new Callback<List<Coba>>() {
        @Override
        public void onResponse(Call<List<Coba>> call, Response<List<Coba>> response) {
            try {
                List<Coba> jsonResponse = response.body();
                data = new ArrayList<>(jsonResponse);
                Log.i("HASIL", "onResponse: "+data);
            }catch (Exception e) {
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<List<Coba>> call, Throwable t) {
            Log.d("Error",t.getMessage());
        }
    });
}



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_blank, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
    recyclerView.setHasFixedSize(true);
   // loadJSON();
    adapter = new MyAdapter(data);
    recyclerView.setAdapter(adapter);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(llm);

    return rootView;
}

}

以及我的适配器类中的这个 onbindview

    public void onBindViewHolder(MyAdapter.MyViewHolder holder, int position) {
    holder.mTextView.setText(String.valueOf(coba.get(position).getId()));
    holder.mDetView.setText(String.valueOf(coba.get(position).getSlug()));
    holder.mVerView.setText(String.valueOf(coba.get(position).getType()));
    holder.mCardView.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(v.getContext(),DetailBerita.class);
            v.getContext().startActivity(intent);
            System.out.println("Clicked");
        }
    });
}

【问题讨论】:

    标签: android arrays json retrofit


    【解决方案1】:

    看来您需要通知适配器。改造不会为您做到这一点。

    另外,不要设置data = new ArrayList。如果您希望它显示在适配器中,则需要改为 clear()addAll()

    request.getPostDet().enqueue(new Callback<List<Coba>>() {
        @Override
        public void onResponse(Call<List<Coba>> call, Response<List<Coba>> response) { 
            data.clear();
            try {
                List<Coba> responseBody = response.body();
                data.addAll(responseBody);
                Log.i("HASIL", "onResponse: "+data);
            } catch (Exception e) {
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
            adapter.notifyDataSetChanged();
        }
    

    【讨论】:

    • 你能给出学习改造的最佳教程网站的链接吗?
    • 它仍然没有向适配器显示任何数据。但是当我检查 for looping ..它似乎反应没问题..
    • 它现在可以工作了..谢谢..我在我的 onbindview 中添加了 String.valueOf,然后我通过添加 data.addAll(responseBody); 来使用您的解决方案; ,不使用data.clear;
    • 如果您不使用 clear,您会在以下调用 Retrofit 时在列表中获得重复数据
    猜你喜欢
    • 2015-11-16
    • 2015-09-10
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多