【问题标题】:RecyclerView Not showing data from Json arrayRecyclerView 不显示来自 Json 数组的数据
【发布时间】:2018-09-21 16:05:06
【问题描述】:

每当我尝试将数据添加到回收站视图时,回收站视图都不会显示任何数据。我尝试调试程序,并成功使用 Retrofit 将 JSON 数据获取到应用程序中(通过在日志中打印来检查)。但是 RecyclerView 没有显示数据。这是我的代码:

CartActivity.java

 public class CartActivity extends AppCompatActivity {
RecyclerView listshowrcy;
List<CartDisplay>  cartlist = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cart);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    API api = retrofit.create(API.class);
    String username = getIntent().getStringExtra("Username");
    Call<List<CartDisplay>> call = api.getCartContent(username);
    call.enqueue(new Callback<List<CartDisplay>>() {
        @Override
        public void onResponse(Call<List<CartDisplay>> call, Response<List<CartDisplay>> response) {
            List<CartDisplay> cart = response.body();
            for(CartDisplay cartContent : cart){
                cartlist.add(cartContent);
            }
        }

        @Override
        public void onFailure(Call<List<CartDisplay>> call, Throwable t) {

        }
    });

    listshowrcy = (RecyclerView)findViewById(R.id.cartList);
    listshowrcy.setHasFixedSize(true);
    CartAdapter cardadapter = new CartAdapter(cartlist,this,username);
    listshowrcy.setAdapter(cardadapter);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    listshowrcy.setLayoutManager(linearLayoutManager);



}
}

CartAdapter.java

public class CartAdapter extends RecyclerView.Adapter<CartAdapter.Holderview> {
private List<CartDisplay> cartlist;
private Context context;
private String username;

public CartAdapter(List<CartDisplay> cartlist, Context context,String username) {
    this.cartlist = cartlist;
    this.context = context;
    this.username = username;
}

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

@Override
public void onBindViewHolder(Holderview holder, int position) {
    holder.pname.setText(cartlist.get(position).getP_name());
    holder.pquant.setText(cartlist.get(position).getQuantity());
    holder.price.setText(String.valueOf(cartlist.get(position).getPrice()));
}

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

class Holderview extends RecyclerView.ViewHolder
{
    TextView pname;
    TextView pquant;
    TextView price;

    Holderview(View itemview){
        super(itemview);
        pname = (TextView)itemview.findViewById(R.id.product_name);
        pquant = (TextView)itemview.findViewById(R.id.product_quant);
        price = (TextView)itemview.findViewById(R.id.product_price);
    }

}

}

【问题讨论】:

    标签: android android-recyclerview retrofit retrofit2 recyclerview-layout


    【解决方案1】:

    收到回复后,您必须通知适配器,数据已更改:

        @Override
        public void onResponse(Call<List<CartDisplay>> call, Response<List<CartDisplay>> response) {
            List<CartDisplay> cart = response.body();
            cartList.clear(); // don't forget to clear list, to avoid duplicates
            for(CartDisplay cartContent : cart){
                cartlist.add(cartContent);
            }
            adapter.notifyDataSetChanged();
        }
    

    另一种方式:你可以创建方法:adapter.setData(cardList) 并在那里刷新适配器数据并调用notifyDataSetChanged()

    【讨论】:

      【解决方案2】:

      除了@kdblue 的回答之外,您的代码还有另一个问题。适配器不知道新数据已添加到基础列表中。

      您可以使用notifyDataSetChanged:

      List<CartDisplay> cart = response.body();
      for(CartDisplay cartContent : cart){
          cartlist.add(cartContent);
      }
      cardadapter.notifyDataSetChanged();
      

      或者让适配器直接处理新项目,通过向适配器添加一个方法,例如:

      public void add(CartDisplay cartDisplay) {
        cartlist.add(user);
        notifyItemInserted(cartlist.size());
      }
      

      并将项目直接添加到适配器:

      List<CartDisplay> cart = response.body();
      for(CartDisplay cartContent : cart){
          cardadapter.add(cartContent);
      }
      

      请注意,您必须更改代码结构才能应用这些策略。

      【讨论】:

      • 如果某个答案帮助您解决了问题,请考虑将其标记为已接受,以便其他用户可以更轻松地找到它。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多