Как получить position EditText в формате строки используя BaseAdapter?
Суть такова. У меня есть ListView
private ListView list;
private String[] names = {"Русский язык", "Математика", "Обществознание", "Биология", "Иностранный язык", "История", "Химия", "География", "Информатика", "Литература", "Физика"};
private int[] images = {R.drawable.icons1, R.drawable.icons2, R.drawable.icons3, R.drawable.icons4, R.drawable.icons5, R.drawable.icons6, R.drawable.icons7, R.drawable.icons8, R.drawable.icons9, R.drawable.icons9, R.drawable.icons10, R.drawable.icons11};
ArrayList<ResorsesForRow> resorsesForRows = new ArrayList<ResorsesForRow>();
private Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bals2);
button = findViewById(R.id.button);
list = findViewById(R.id.listView);
for(int i=0; i<11; i++){
resorsesForRows.add(new ResorsesForRow(names[i], images[i]));
Log.d(TAG, names[i]);
}
AdapterForList adapterForList = new AdapterForList(this, resorsesForRows);
list.setAdapter(adapterForList);
}
Есть адаптер наследованный от BaseAdapter
public class AdapterForList extends BaseAdapter {
Context context;
LayoutInflater layoutInflater;
ArrayList<ResorsesForRow> rows;
SharedPreferences sharedPreferences;
AdapterForList(Context ctx, ArrayList<ResorsesForRow> list){
context = ctx;
rows = list;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return rows.size(); // Общее кол-во элиментов
}
@Override
public Object getItem(int position) {
return rows.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view==null){
view = layoutInflater.inflate(R.layout.row_for_listview, parent, false);
}
ResorsesForRow resorsesForRow = getResorsessForRow(position);
ImageView imageView = view.findViewById(R.id.image_view);
imageView.setImageResource(resorsesForRow.img);
TextView textView = view.findViewById(R.id.name);
textView.setText(resorsesForRow.name);
EditText editText = view.findViewById(R.id.edittext);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
int ball = Integer.parseInt(s.toString());
if(ball<=100){
sharedPreferences = context.getSharedPreferences("pref", MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
Object position;
edit.putString(position.toString(), text inside edittext);
edit.apply();
}
}
});
return view;
}
ResorsesForRow getResorsessForRow(int position) {
return (ResorsesForRow) getItem(position);
}
}
Мне нужно как-то получить внутри метода afterTextChanged() позицию (порядковый номер) EditText и затем передать его в качестве ключа в SharedPreferences, а в качестве значения использовать введенное число. Я не понимаю как я могу получить номер позиции EditText
Ответы (2 шт):
Вот же номер позиции:
int position.Вынеси работу с
SharedPreferencesиз адаптера. Адаптер должен делать только одну вещь, а именно рисовать элементы списка.Используй
Recyclerviewили реализуй паттернViewholder, т.к. в данной реализации, при каждом вызове метода getView вызываются методыfindViewById(а это очень ресурсоемкая операция). На больших списках твой адаптер будет лагать.
Думаю вам это поможет. Здесь уже есть реализованый onTextChanged в адаптере.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_edittext, parent, false);
// pass MyCustomEditTextListener to viewholder in onCreateViewHolder
// so that we don't have to do this expensive allocation in onBindViewHolder
ViewHolder vh = new ViewHolder(v, new MyCustomEditTextListener());
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// update MyCustomEditTextListener every time we bind a new item
// so that it knows what item in mDataset to update
holder.myCustomEditTextListener.updatePosition(holder.getAdapterPosition());
holder.mEditText.setText(mDataset[holder.getAdapterPosition()]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public EditText mEditText;
public MyCustomEditTextListener myCustomEditTextListener;
public ViewHolder(View v, MyCustomEditTextListener myCustomEditTextListener) {
super(v);
this.mEditText = (EditText) v.findViewById(R.id.editText);
this.myCustomEditTextListener = myCustomEditTextListener;
this.mEditText.addTextChangedListener(myCustomEditTextListener);
}
}
// we make TextWatcher to be aware of the position it currently works with
// this way, once a new item is attached in onBindViewHolder, it will
// update current position MyCustomEditTextListener, reference to which is kept by ViewHolder
private class MyCustomEditTextListener implements TextWatcher {
private int position;
public void updatePosition(int position) {
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
// no op
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
mDataset[position] = charSequence.toString();
}
@Override
public void afterTextChanged(Editable editable) {
// no op
}
}
}