【问题标题】:RecyclerView only displays first 2 itemsRecyclerView 只显示前 2 项
【发布时间】:2018-03-26 21:04:12
【问题描述】:

我在片段中有一个 RecyclerView,它负责显示 JSON 数据,一切正常,但它只显示 JSON 的前两项。我尝试通过敬酒来检查列表的大小,但它似乎工作正常,因为它显示 4。

我还检查了我所有的 XML 文件以查看已设置为 wrap_content 的布局的属性。

这是我在 onCreateView 中的代码

program_list = view.findViewById(R.id.program_list);
    program_list.setHasFixedSize(true);
    program_list.setLayoutManager(new LinearLayoutManager(getActivity()));
    program_list.setNestedScrollingEnabled(false);

    listItems = new ArrayList<>();

    program_adapter = new Program_Adapter(listItems,getActivity());
    program_list.setAdapter(program_adapter);
    program_progress = view.findViewById(R.id.program_progress);

    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            program_data,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    program_progress.setVisibility(View.GONE);
                    try {
                        JSONObject json = new JSONObject(response);
                        JSONArray array = json.getJSONArray("programs");

                        listItems.clear();

                        for(int i = 0; i < array.length(); i++){
                            JSONObject o = array.getJSONObject(i);
                            Program_Item item = new Program_Item(
                                    o.optString("name"),
                                    o.optString("channel"),
                                    o.optString("description"),
                                    o.optLong("timings"),
                                    o.optString("logo")
                            );

                            listItems.add(item);
                        }

                        Toast.makeText(getActivity(), "Size " + listItems.size(), Toast.LENGTH_SHORT).show();

                        program_adapter.notifyDataSetChanged();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            program_progress.setVisibility(View.GONE);
            Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
    requestQueue.add(stringRequest);

这是我的适配器

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

View v;

private List<Program_Item> listItems;
private Context context;

public Program_Adapter(List<Program_Item> listItems, Context context) {
    this.listItems = listItems;
    this.context = context;
}

@Override
public Program_Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.program_card, parent, false);
    return new ViewHolder(v);

}

@Override
public void onBindViewHolder(Program_Adapter.ViewHolder holder, int position) {
    final Program_Item item = listItems.get(position);

    holder.program_name.setText(item.getName());
    holder.program_channel.setText(item.getNetwork());
    holder.program_description.setText(item.getDescription());

    Glide.with(context)
            .load(item.getLogo())
            //.thumbnail(0.9f)
            //.placeholder(R.drawable.ic_image)
            .into(holder.program_logo);


    holder.card_body.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            item.getTimings();

        }
    });

}

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

public class ViewHolder extends RecyclerView.ViewHolder{

    public TextView program_name,program_channel,program_description;
    public ImageView program_logo;
    public LinearLayout card_body;

    public ViewHolder(View itemView) {
        super(itemView);

        program_channel = (TextView) itemView.findViewById(R.id.program_channel);
        program_description = (TextView) itemView.findViewById(R.id.program_description);
        program_name = (TextView) itemView.findViewById(R.id.program_name);
        program_logo = (ImageView) itemView.findViewById(R.id.program_logo);
        card_body = (LinearLayout) itemView.findViewById(R.id.program_card_body);

    }
}

}

【问题讨论】:

  • 代码看起来不错。固定大小为 4 的 ArrayList 怎么样,只是为了尝试一下
  • @ruben 评论了修复arraylist大小的声明仍然没有区别
  • 我认为您没有将更新后的列表传递给适配器

标签: android json android-recyclerview


【解决方案1】:

我可以看到一个错误,您没有设置回收站视图的方向。

LinearLayoutManager linear = new new LinearLayoutManager(getActivity());
linear.setOrientation(LinearLayoutManager.VERTICAL);
program_list.setLayoutManager(linear);

如果它只是一个回收器视图,则不需要 setNestedScrollingEnabled(false)

希望这会有所帮助!!

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2019-01-26
    • 2021-01-09
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2019-05-25
    相关资源
    最近更新 更多