#android-studio #listview #setbackground
Вопрос:
Я использую ListView для отображения данных. При вводе фактического значения оно будет сравниваться между фактическим и исходным значением.
Если фактическое значение выходит за пределы допуска (больше/меньше), он установит цвет фона Diff TextView КРАСНЫМ. К вашему сведению, ввод фактического значения с кнопки» / -«, и он покажет AlertDialog следующим образом:
Но, после набора, чтобы быть КРАСНЫМ. когда я прокручиваю представление списка, красный цвет случайным образом перемещается на другую строку. Я обнаружил, что в stackoverflow у некоторых людей тоже возникла эта проблема. И это не совсем ясно, чтобы быть решенным.
Вот мой код: функция в основной деятельности:
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;
}
}