آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل در گرفتن متن یک editText در یک recyclerView بعد از وارد کردن مقدار توسط کاربر(حل شد)

Amirhussein  4 سال پیش  4 سال پیش
0 0

میخوام مقدار یک 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;
}




}
 برای این سوال 2 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
Amirhussein  4 سال پیش
0 0

بعد از کمی جست و جو توی سایت های دیگه مشکل حل شد. مراحل حل رو اینجام میذارم شاید برای کسی قابل استفاده بود.

با توجه به این که آیتم های  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 استفاده کنید برنامه کرش میکنه و ممکنه وقت زیادی برای پیدا کردن مشکل تلف بشه.

0 0
درود. ما چون در کد زیر Mark item = list.get(position); آیتم مورد نظر را داریم و واریز میکنیم داخل متغییر item میتوانیم با استفاده از دستور زیر هر آیتم را ویرایش کنیم item.name = charSequence.toString(); و نیازی به محاسبه مجدد آیتم در لیست yourArrayList.set(holder.getAdapterPosition ,s.toString); به این صورت نیس و به اصطلاح این روشی که بنده مطرح کردم رفرنست داره و خودش داخل لیست تغییر میده (4 سال پیش)
+1 0
بله کاملا درسته. این روش درست تر و بهتره. دیگه نیازی به تعریف کردن یک آرایه جدید و گرفتن اون با متد getter نیست . همچنین موقع ست کردن مقدار تو آرایه باید چند تا شرط گذاشته بشه که برنامه کرش نکنه! موقع نوشتن این موردی که شما گفتید به ذهنم نرسید. سپاس (4 سال پیش)
پاسخ به سوال 
Milad  4 سال پیش
+1 0

 پاسخ صحیح

درود، در نظر میگیریم که 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


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .