مشکل در گرفتن متن یک editText در یک recyclerView بعد از وارد کردن مقدار توسط کاربر(حل شد)
میخوام مقدار یک editText که داخل یک recyclerView تعریف شده بعد از تغییر کردن اون توسط کاربر رو بگیرم.
از اسنیپ recyclerView استاد استفاده کردم. ولی نمی دونم چطور باید این کار رو بکنم. متد getItem در arraylist رو امتحان کردم ولی مقدار اون آیتم رو قبل از تغییر توسط کاربر میده.
این main Activity هست:
public class MainActivity extends AppCompatActivity {
ArrayList<Mark> itemList;
MyRecyclerAdapter adapter;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
Button btn_add = (Button) findViewById(R.id.btn_add);
Button btn_remove = (Button) findViewById(R.id.btn_remove);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
itemList = new ArrayList<>();
itemList.add(0, new Mark("", "", "", ""));
adapter = new MyRecyclerAdapter(itemList);
recyclerView.setAdapter(adapter);
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemList.add(new Mark("", "", "", ""));
adapter.notifyItemInserted(itemList.size());
calculate();
}
});
btn_remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemList.remove(itemList.size() - 1);
adapter.notifyItemRemoved(itemList.size());
}
});
}
private void calculate() {
}
}
اینم کلاس Mark هست :
public class Mark {
String name;
String min;
String max;
String times;
public Mark(String name, String min, String max, String times) {
this.name = name;
this.min = min;
this.max = max;
this.times = times;
}
}
بعد از کمی جست و جو توی سایت های دیگه مشکل حل شد. مراحل حل رو اینجام میذارم شاید برای کسی قابل استفاده بود.
با توجه به این که آیتم های recyclerView با اسکرول کردن کاربر همیشه بازیافت میشن و دوباره استفاده می شن، نمیشه مقدار edit text رو بعدا گرفت. برای گرفتن مقدار اون باید بلافاصله بعد از این که کاربر مقدار رو وارد کرد اون رو گرفت. برای این کار باید از یک TextWatcher استفاده کنید. به این شکل:
ArrayList<String> yourArrayList = new ArrayList<String>();
holder.edt_yourEditText.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) {
yourArrayList.set(holder.getAdapterPosition ,s.toString);
}
});
holder.btn_remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
در متد afterTextChange می تونید مقداری که کاربر وارد کرده رو بگیرید.و ترجیحا در یک آرایه داینامیک ذخیره کنید.
برای دسترسی به این آرایه در سایر acticity ها باید یک متد getter براش در کلاس MyRecyclerAdapter بنویسید. به این صورت :
public ArrayList<String> getyourArrayList() {
return yourArrayList;
}
اما مسئله بعدی که وجود داره اینه که برای ست کردن مقدار ادیت تکست شما به یک index احتیاج دارین که مقدار ادیت تکست توی اون خونه از آرایه شما ذخیره بشه. برای این کار نمی تونید از position استفاده کنید.باید از holder.getAdapterPositions استفاده کنید. اگر از position استفاده کنید برنامه کرش میکنه و ممکنه وقت زیادی برای پیدا کردن مشکل تلف بشه.
درود، در نظر میگیریم که adapter ما به شکل زیر است و دارای یک editText می باشد. که درصورت ویرایش توسط کاربر بتوانیم متوجه تغییر آن شویم.
ما میتوانیم با استفاده از متد زیر تغییرات اعمال شده برروی ادیت تکس را در لحظه بدست بیاریم
addTextChangedListener
________________________________________________________________________________________________________
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
private ArrayList<Mark> list;
public MyRecyclerAdapter(ArrayList<Mark> list) {
this.list = list;
}
@Override
public MyRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, parent, false);
ViewHolder viewHolder = new ViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Mark item = list.get(position);
holder.editTextTextPersonName.setText(item.name);
holder.editTextTextPersonName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.i("Milad", "beforeTextChanged-charSequence: " + charSequence);
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.i("Milad", "onTextChanged-charSequence: " + charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
@Override
public int getItemCount() {
return list.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
EditText editTextTextPersonName;
public ViewHolder(View itemView) {
super(itemView);
editTextTextPersonName = (EditText) itemView.findViewById(R.id.editTextTextPersonName);
}
}
}
خروجی ui و خروجی برنامه در logcat به این صورت می باشد


پس از هربار تایپ کردن هر کارکتر توسط کاربر می توان مقدار تغییر شده را بررسی کرد.
ولی اگر می خواهید پس از به پایان رسیدن تایپ کاربر این مقدار را بگیرید باید هر آیتم دارای یک دکمه تایید باشد که بعد از تایپ شدن کاربر. کاربر آن را تایید کرده و پس از کلیک کردن مقدار هر یک آیتم را از طریق adapter موردنظر مدیریت کرد.
موفق و پیروز باشید.
MiladCloudy
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
