Android ListView Adapter меняет цвет при прокрутке мимо элемента - PullRequest
0 голосов
/ 07 июня 2018

Хорошо, у нас есть некоторые результаты, возвращающие набор заказов на акции, которые мы сделали.В зависимости от того, полностью ли зарегистрирован заказ на поставку, мы показываем фоновый цвет элемента строки зеленым или синим с помощью оператора if в адаптере.

Проблема в том, что при загрузке ордера правильно отображаются зеленым / синим цветом.Но когда вы прокручиваете вниз, синие становятся зелеными.(См. Изображения).Мы думаем, что это может быть изменение данных где-то, но не уверены, почему это происходит, поскольку мы просто прокручиваем страницу.

Before scroll After scroll

Код, который создает это:

StockOrdersFragment.java

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

    myView = inflater.inflate(R.layout.stock_orders_layout, container, false);
    listView = myView.findViewById(R.id.listView);

    stockOrdersService = new StockOrdersService(this);

    stockOrdersService.fetchFromServer(getActivity());

    fetchStockOrders();

    return myView;
}

public void fetchStockOrders()
{
    stockOrders.clear();

    RealmResults<StockOrder> savedStockOrders = stockOrdersService.all();

    stockOrders.addAll(savedStockOrders);

    StockOrdersAdaptor adaptor = new StockOrdersAdaptor(stockOrders, getActivity());

    listView.setAdapter(adaptor);
}

@Override
public void ordersReceived() {
    fetchStockOrders();
}

StockOrdersAdaptor.java (Бит, который делаетцвет)

lastPosition = position;

if(stockOrder != null){
    viewHolder.stockOrderId.setText(String.valueOf(stockOrder.id));
    viewHolder.supplierName.setText(stockOrder.supplier.name);

    if (stockOrder.allItemsHaveBeenReceived()) {
        convertView.setBackgroundResource(R.color.colorGreen);
    }
}

// Return the completed view to render on screen
return convertView;

AllItemsHaveBeenRectained ()

public Boolean allItemsHaveBeenReceived()
{
    for (StockOrderDetails detail: details) {
        if (detail.quantity != detail.quantityReceived) {
            return false;
        }
    }
    return true;
}

1 Ответ

0 голосов
/ 07 июня 2018

Добавьте еще оператор здесь:

if (stockOrder.allItemsHaveBeenReceived()) {
    convertView.setBackgroundResource(R.color.colorGreen);
} else {
    convertView.setBackgroundResource(R.color.colorBlue);
}

Проблема в том, что когда ваш предмет перерабатывается, он остается грязным.Убедитесь, что вы заполняете все элементы пользовательского интерфейса из макета элемента списка каждый раз, когда к нему привязывается адаптер.

...