物品在RecyclerView中不可见的可见性

时间:2017-11-18 09:47:34

标签: android android-recyclerview recycler-adapter

我有大约12张CardView。每个设置ImageView在GONE的可见性取决于“高”变量是真还是假,但是当我向下滚动然后向上滚动一些ImageView小部件消失时我不得不提到最后一个ImageView也没有显示。

@Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        Currency currency = currencies.get(i);

        Double valor_actual = currencies.get(i).getValores().get(0);
        Double valor_anterior = currencies.get(i).getValores().get(1);

        viewHolder.textValue.setText(valor_actual.toString());

        BigDecimal bigDecimal = null;
        if (currency.getHigh()) {
            bigDecimal = new BigDecimal(valor_actual).subtract(new BigDecimal(valor_anterior));
            viewHolder.textInfo.setTextColor(Color.parseColor("#ff669900"));
            // doesn't work properly
            viewHolder.imageDown.setVisibility(View.GONE);
        }
        if (!currency.getHigh()){
            bigDecimal = new BigDecimal(valor_anterior).subtract(new BigDecimal(valor_actual));
            viewHolder.textInfo.setTextColor(Color.parseColor("#ffcc0000"));
            // doesn't work properly
            viewHolder.imageUp.setVisibility(View.GONE);
        }

        String unidad_medida = currency.getUnidad_medida();
        if (bigDecimal != null) {
            try {
                StringBuilder sb = new StringBuilder(currencyFormat(bigDecimal));
                if (unidad_medida.equalsIgnoreCase("porcentaje")) {
                    sb.deleteCharAt(0);
                    sb.insert(0, "%");
                }
                viewHolder.textInfo.setText(sb.toString());
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
        viewHolder.textName.setText(currency.getNombre());
    }

这里效果很好

enter image description here

但是当我向下滚动向后滚动时,第三个CardView没有显示ImageView:

enter image description here

4 个答案:

答案 0 :(得分:3)

你还需要将Visible置于其他状态。如果您在运行时设置了它们的可见性,请为列表中的每个项目执行此操作。

if (currency.getHigh()) {
     bigDecimal = new BigDecimal(valor_actual).subtract(new BigDecimal(valor_anterior));
     viewHolder.textInfo.setTextColor(Color.parseColor("#ff669900"));
     // doesn't work properly
     viewHolder.imageDown.setVisibility(View.GONE);
     viewHolder.imageUp.setVisibility(View.VISIBLE);  
}
else {
     bigDecimal = new BigDecimal(valor_anterior).subtract(new BigDecimal(valor_actual));
     viewHolder.textInfo.setTextColor(Color.parseColor("#ffcc0000"));
     // doesn't work properly
     viewHolder.imageDown.setVisibility(View.VISIBLE);
     viewHolder.imageUp.setVisibility(View.GONE); 
 }

答案 1 :(得分:1)

当您滚动时,可以重复使用用于在位置0显示项目的相同视图来显示位置上的项目,例如,如果位置0处的项目不再可见,则显示该项目(这样,循环视图可以避免使用新视图创建已创建但不可见的视图。)

因此,让我们考虑一下我们最终在视图上没有图像的情况。

位置0的项目应显示图标,位置5的项目应显示图标。当你滚动recyclerview重用为pos 0创建的视图来显示在pos 5的视图。所以基本上你最终调用viewHolder.imageUp.setVisibility(View.GONE)和viewHolder.imageDown.setVisibility(View.GONE);在同一个视图上。

解决方案是操纵其他视图的可见性,如:

viewHolder.imageUp.setVisibility(View.GONE);

viewHolder.imageDown.setVisibility(View.VISIBLE);

答案 2 :(得分:0)

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    Currency currency = currencies.get(i);

    Double valor_actual = currencies.get(i).getValores().get(0);
    Double valor_anterior = currencies.get(i).getValores().get(1);

    viewHolder.textValue.setText(valor_actual.toString());

    BigDecimal bigDecimal = null;
    if (currency.getHigh()) {
        bigDecimal = new BigDecimal(valor_actual).subtract(new BigDecimal(valor_anterior));
        viewHolder.textInfo.setTextColor(Color.parseColor("#ff669900"));

        viewHolder.imageDown.setVisibility(View.GONE);
        viewHolder.imageUp.setVisibility(View.VISIBLE);
    } else {
        bigDecimal = new BigDecimal(valor_anterior).subtract(new BigDecimal(valor_actual));
        viewHolder.textInfo.setTextColor(Color.parseColor("#ffcc0000"));

        viewHolder.imageUp.setVisibility(View.GONE);
        viewHolder.imageDown.setVisibility(View.VISIBLE);
    }

    String unidad_medida = currency.getUnidad_medida();
    if (bigDecimal != null) {
        try {
            StringBuilder sb = new StringBuilder(currencyFormat(bigDecimal));
            if (unidad_medida.equalsIgnoreCase("porcentaje")) {
                sb.deleteCharAt(0);
                sb.insert(0, "%");
            }
            viewHolder.textInfo.setText(sb.toString());
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
    }
    viewHolder.textName.setText(currency.getNombre());
}

答案 3 :(得分:0)

当您拥有其元素在运行时根据用户操作或网络事件而更改的数据集合时,

RecyclerView小部件。

RecyclerView使用可能是imageview或textview的可重用视图

最好将BaseAdapter用于小型数据集

Refer Documentation

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html