Recycler视图列表适配器更新UI不正确

时间:2016-02-13 13:48:39

标签: android listview android-recyclerview recycler-adapter

我创建了一个回收站视图适配器。基于适配器中的项目,我正在尝试更改该行的UI。首次加载屏幕时,UI将正确呈现。但是一旦我滚动浏览,屏幕就会更新,即使对于不应该有的行也是如此。 这是代码:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    final OrderItem order = mItems.get(i);
    viewHolder.tvName.setText(getCustomers().get(order.getmConsumerId()).getProfile().getFirstName().toUpperCase() );
    viewHolder.tvDelType.setText(getDeliveryType(order.getmDeliveryType()));
    viewHolder.tvTime.setText(formatTime(order.getmETATime()));//format time before present
    viewHolder.tvAmt.setText("Rs " + order.getmAmount());
    viewHolder.rlvName.setTitleText(order.getmConsumerId().substring(0, 1));
    viewHolder.rlvName.setTitleSize(82f);
    viewHolder.tvDetails.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context, OrderDetailsActivity.class);
            Gson gson = new Gson();
            String ord = gson.toJson(order);
            String user = gson.toJson(getCustomers().get(order.getmConsumerId()));
            intent.putExtra("orderItem", ord);
            intent.putExtra("user", user);
            context.startActivity(intent);
        }
    });
    setListeners(viewHolder, order, i);
    //setStatus(viewHolder,order,i);
    if(!order.getmOrderStatus().equals(Constants.ENUM_ORDERS_STATUS_PENDING))
    {
        viewHolder.tvOrderStatus.setText((order.getmOrderStatus().toUpperCase()));
        viewHolder.tvOrderStatus.setVisibility(View.VISIBLE);
        viewHolder.llButtons.setVisibility(View.GONE);
    }

    //viewHolder.rlvName.setBackgroundColor(Color.parseColor("FF0000"));
}

因此,基于我的订单所具有的价值,我需要更改该行的UI。滚动后,它会更改不应该有的行的值。

请建议。

1 个答案:

答案 0 :(得分:1)

由于recyler视图RAM管理,recyler视图尝试从缓存加载卡,并且由于您的recyler视图缓存,项目加载不正确。 为防止这种情况发生,您必须向else添加if,如下所示:

if(!order.getmOrderStatus().equals(Constants.ENUM_ORDERS_STATUS_PENDING))
{
    viewHolder.tvOrderStatus.setText((order.getmOrderStatus().toUpperCase()));
    viewHolder.tvOrderStatus.setVisibility(View.VISIBLE);
    viewHolder.llButtons.setVisibility(View.GONE);
}
else
{
    //The Default Item View Settings Here...
}