В представлении списка отображается ошибка при прокрутке Android studio

#android-studio #listview #setbackground

Вопрос:

Я использую ListView для отображения данных. При вводе фактического значения оно будет сравниваться между фактическим и исходным значением.

из-за платы за проезд

Если фактическое значение выходит за пределы допуска (больше/меньше), он установит цвет фона Diff TextView КРАСНЫМ. К вашему сведению, ввод фактического значения с кнопки» / -«, и он покажет AlertDialog следующим образом:

отрегулируйте измерение

Но, после набора, чтобы быть КРАСНЫМ. когда я прокручиваю представление списка, красный цвет случайным образом перемещается на другую строку. Я обнаружил, что в stackoverflow у некоторых людей тоже возникла эта проблема. И это не совсем ясно, чтобы быть решенным.

ошибка gif

Вот мой код: функция в основной деятельности:

 public void showRulerAdjusment(View view, int position) {
        final TextView txt_adj = (TextView) view.findViewById(R.id.txt_adj_val);
        final TextView txt_adj_2 = (TextView) view.findViewById(R.id.txt_adj_val_2);
        final TextView txt_org = (TextView) view.findViewById(R.id.txt_org_val);
        final TextView txt_org_2 = (TextView) view.findViewById(R.id.txt_org_val_2);
        final TextView txt_diff = (TextView) view.findViewById(R.id.txt_diff);
        final TextView txt_diff_2 = (TextView) view.findViewById(R.id.txt_diff_2);
        final TextView txt_tol = (TextView) view.findViewById(R.id.txt_tol);

        String adj = txt_adj.getText().toString();
        String adj_2 = txt_adj_2.getText().toString();
        final String org = txt_org.getText().toString();
        final String org_2 = txt_org_2.getText().toString();
        final String tol = txt_tol.getText().toString();

        final AlertDialog.Builder builder = new AlertDialog.Builder(MeasurementActivity.this,
                R.style.MyDialogTheme);
        LayoutInflater inflater = getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.ruler_adjustment, null);
        builder.setView(dialogView);
        builder.setCancelable(true);
        builder.setTitle("Value adjustment");

        final ImageView btn_decrement = (ImageView) dialogView.findViewById(R.id.btn_decrement);
        final ImageView btn_increment = (ImageView) dialogView.findViewById(R.id.btn_increment);
        final TextView txt_value = (TextView) dialogView.findViewById(R.id.txt_value);
        final SeekBar ruler = (SeekBar) dialogView.findViewById(R.id.sb_ruler);
        final TextView txt_value_2 = (TextView) dialogView.findViewById(R.id.txt_result);
        final TextView txt_left_value = (TextView) dialogView.findViewById(R.id.txt_left_value);
        final TextView txt_right_value = (TextView) dialogView.findViewById(R.id.txt_right_value);

        value_num = Integer.parseInt(org);
        ruler.setProgress(getCodeInt(org_2));
        txt_value.setText(org);
        txt_value_2.setText(org_2);
        txt_left_value.setText(org);
        txt_right_value.setText(String.valueOf(value_num   1));

        btn_decrement.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                value_num -= 1;
                txt_value.setText(String.valueOf(value_num));
                txt_left_value.setText(String.valueOf(value_num));
                txt_right_value.setText(String.valueOf(value_num   1));
            }
        });

        btn_increment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                value_num  = 1;
                txt_value.setText(String.valueOf(value_num));
                txt_left_value.setText(String.valueOf(value_num));
                txt_right_value.setText(String.valueOf(value_num   1));
            }
        });

        ruler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            int progressBar = 0;

            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                progressBar = i;
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                if (progressBar > 0 amp;amp; progressBar < 16) {
                    txt_value_2.setText(getCodeString(progressBar));
                } else if (progressBar == 16) {
                    value_num  = 1;
                    txt_value_2.setText("");
                } else {
                    txt_value_2.setText("");
                }
            }
        });

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @SuppressLint("ResourceAsColor")
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                txt_adj.setText(String.valueOf(value_num));
                txt_adj_2.setText(txt_value_2.getText().toString());

                //-----new calc-------
                int original_val = Integer.parseInt(org);
                int original_val_2 = getCodeInt(org_2);
                int adj_val = Integer.parseInt(txt_adj.getText().toString());
                int adj_val_2 = getCodeInt(txt_adj_2.getText().toString());
                int diff_result=0, diff_2_result=0;

                int value_a, value_a2, value_b, value_b2;
                if (original_val > adj_val){
                    value_a = adj_val;
                    value_a2 = original_val_2;
                    value_b = original_val;
                    value_b2 = adj_val_2;
                }else{
                    value_a = original_val;
                    value_a2 = adj_val_2;
                    value_b = adj_val;
                    value_b2 = original_val_2;
                }

                if(value_a < value_b){
                    if (value_a2 == 0 amp;amp; value_b2 == 0){
                        diff_result = value_b - value_a;
                    }else{
                        diff_result = value_b - value_a - 1;
                        int distance = (16 - value_b2)   value_a2;
                        int diff_extend = distance / 16;
                        diff_2_result = distance - (diff_extend * 16);
                        diff_result  = diff_extend;
                    }
                }else{
                    diff_2_result = Math.abs(value_a2 - value_b2);
                }

                float result_tol;
                if (getCodeInt(tol) == 16){
                    result_tol = doCalcValue(1, 0);
                }else{
                    result_tol = doCalcValue(0, getCodeInt(tol));
                }
                float result_diff;
                result_diff = doCalcValue(diff_result, diff_2_result);

                txt_diff.setText(String.valueOf(diff_result) "  ");
                txt_diff_2.setText(getCodeString(diff_2_result));

                if (result_diff > result_tol){
                    txt_diff.setBackgroundColor(getResources().getColor(R.color.color_defect));
                    txt_diff_2.setBackgroundColor(getResources().getColor(R.color.color_defect));
                }else{
                    txt_diff.setBackgroundColor(getResources().getColor(R.color.true_white));
                    txt_diff_2.setBackgroundColor(getResources().getColor(R.color.true_white));
                }
            }
        });
        builder.show();
    }
 

и этот список пользовательских адаптеров:

 public class MeasurementListAdapter extends SimpleAdapter {
    private Activity context;

    public MeasurementListAdapter(Activity context, List<? extends Map<String, ?>> data,
                                  int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        System.out.println("GET VIEW " position);
        View inflated = super.getView(position, convertView, parent);
        inflated.findViewById(R.id.btn_adjust).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();
                MeasurementActivity measure = (MeasurementActivity) context;
                measure.showRulerAdjusment(inflated, position);
            }
        });

        return inflated;
    }
}