RecyclerView不显示Json数组中的数据

时间:2018-04-11 16:56:54

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

每当我尝试将数据添加到回收站视图时,回收站视图都不会显示任何数据。我尝试调试程序,我使用Retrofit成功地将JSON数据导入应用程序(通过在Log中打印来检查)。但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);
    }

}

}

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

除了@ 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);
}

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