Как изменить значения во всех Edittext из ListView при изменении одного?
activity_convert.xml
androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ConvertActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ListView
android:id="@+id/list_currency_conv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/calculator"
app:layout_constraintTop_toBottomOf="@id/toolbar" />
</androidx.constraintlayout.widget.ConstraintLayout>
convert_item.xml
Здесь три элемента:
- Символьный код валюты
- Текущее значение валюты относительно рубля
Поле для ввода
<TextView android:id="@+id/vcCharCode" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorPrimaryDark" android:textSize="20sp"> </TextView> <TextView android:id="@+id/vcValue" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> <EditText android:id="@+id/vInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:background="@drawable/rounded_edittext" android:ems="10" android:inputType="numberDecimal" />
Код адаптера ConvertAdapter
public class ConvertAdapter extends ArrayAdapter<Valute> {
String TAG = "ConvertAdapter";
private final Activity context;
private final ArrayList<Valute> valute;
public ConvertAdapter(Activity context, int convert_item, ArrayList<Valute> valute) {
super(context, R.layout.convert_item, valute);
this.context = context;
this.valute = valute;
}
public class ViewHolder
{
TextView vCharCode;
TextView vValue;
EditText vInput;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ConvertAdapter.ViewHolder holder = null;
if(convertView == null)
{
LayoutInflater inflater = context.getLayoutInflater();
convertView = inflater.inflate(R.layout.convert_item, parent,false);
holder = new ConvertAdapter.ViewHolder();
holder.vCharCode = (TextView) convertView.findViewById(R.id.vcCharCode);
holder.vValue = (TextView) convertView.findViewById(R.id.vcValue);
holder.vInput = (EditText) convertView.findViewById(R.id.vInput);
convertView.setTag(holder);
}
else
{
holder = (ConvertAdapter.ViewHolder) convertView.getTag();
}
holder.vCharCode.setText(valute.get(position).getCharCode());
holder.vValue.setText(valute.get(position).getValue().toString());
final String valuePosition = valute.get(position).getValue().toString();
holder.vInput.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.d(TAG, "beforeTextChanged: ");
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.d(TAG, "onTextChanged: " + valuePosition);
}
@Override
public void afterTextChanged(Editable editable) {
Log.d(TAG, "afterTextChanged: ");
}
});
return convertView;
}
}
Вся информация о валютах храниться в ArrrayList. Задача в следующем: при изменении значения в одном editText, автоматически изменять значениях во всех editText, опираясь на значение vValue элемента ListView.
Например: Ввожу 5 долларов и в поля других валют подсчитываются их значения относительно доллара.
В данном куске кода:
final String valuePosition = valute.get(position).getValue().toString();
holder.vInput.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence charSequence,int i,int i1,int i2){
Log.d(TAG,"onTextChanged: "+valuePosition);
}
}
Вытаскивается значение валюты соответствующего поля. Как мне вытаскивать все vValue и заносить подсчитанное в их поля?
ConvertActivity
public class ConvertActivity extends AppCompatActivity {
private Toolbar toolbar;
private ListView listValute;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_convert);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ArrayList<Valute> valuteArrayList = getIntent().getExtras().getParcelableArrayList("valute");
listValute = (ListView) findViewById(R.id.list_currency_conv);
ConvertAdapter converAdapter = new ConvertAdapter(ConvertActivity.this, R.layout.convert_item, valuteArrayList);
listValute.setAdapter(converAdapter);
}
}
Ответы (1 шт):
Как я понял, вопрос заключается именно в отображении новой информации во всех EditText. Я предлагаю, что известно количество элементов списка и их порядок. Поэтому не составит труда создать какой-нибудь цикл, который перебирает все элементы списка и назначает новый текст в EditText каждого.
@Override
public void onTextChanged(CharSequence charSequence, , int i, int i1, int i2) {
// num - количество элементов списка
for (int c = 0; c < num; c++) {
// Над этой строкой можно подумать (я не использовал ViewHolder для ListView). Для вашего случая есть более элегантный способ, я уверен. Покажу только логику, которая должна, по моему замыслу, работать.
String val = String.valueOf(valute.get(num).getValue() * Float.parseFloat(charSequence.toString()));
((EditText) listValue.getChildAt(num).findViewById(R.id.vInput)).setText(val);
};
};
Как-то так. Вы берёте значение, записываемое в текущий EditText, и в цикле изменяете во всех EditText значение на новое. Так как я не знаю, существует ли более быстрый способ найти EditText, я находил его каждый раз.