如何将 RecyclerView 的 EditText 的文本发送到 Activity
How to send text of RecyclerView's EditText to an Activity
我想将 EditText 的文本值从 RecyclerView 适配器发送到 Activity。在我的场景中,我需要在按下按钮时将 EditText 文本从适配器发送到 Activity(按钮在 Activity class 中,而不是在适配器中)。在 Adapter class、
的这段代码中
viewHolder.value.setText(memberUpdate.getAmount());
我已经设置了 EditText 的值。现在我想在单击 Button 时从该适配器获取此值到 Activity class。要单击的按钮是 Activity class 中的 updateBtn = findViewById(R.id.update_expense_btn);
。请告诉我如何获取 Adapter class 到 Activity class.
的 EditText 的值
适配器Class:
class AdapterUpdateExpense extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int MEMBERUPDATE = 4;
private List<Object> items;
private Context context;
private Activity activity;
private boolean isEvenlyRadioChecked;
private Double amount = 0.0;
AdapterUpdateExpense(Activity activity, Context context, List<Object> items, boolean isEvenlyRadioChecked) {
this.activity = activity;
this.context = context;
this.items = items;
this.isEvenlyRadioChecked = isEvenlyRadioChecked;
}
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof MemberUpdate) {
return MEMBERUPDATE;
}
return -1;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder holder = null;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
switch (viewType) {
case MEMBERUPDATE:
View v4 = inflater.inflate(R.layout.update_expense_layout, viewGroup, false);
holder = new holderMemberUpdate(v4);
break;
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
switch (viewHolder.getItemViewType()) {
case MEMBERUPDATE:
holderMemberUpdate view4 = (holderMemberUpdate) viewHolder;
configureHolderMemberUpdate(view4, position);
break;
}
}
private void configureHolderMemberUpdate(final holderMemberUpdate viewHolder, final int position) {
final MemberUpdate memberUpdate = (MemberUpdate) items.get(position);
if (memberUpdate != null) {
viewHolder.name.setText(memberUpdate.getTitle());
viewHolder.value.setText(memberUpdate.getAmount());
}
amount+= Double.valueOf(viewHolder.value.getText().toString());
Log.d("sdfsdfah", getAmount().toString());
}
class holderMemberUpdate extends RecyclerView.ViewHolder{
TextView name;
EditText value;
holderMemberUpdate(View view) {
super(view);
name = view.findViewById(R.id.member_name_txtview);
value = view.findViewById(R.id.member_expense_edittxt);
if(isEvenlyRadioChecked) {
value.setEnabled(false);
} else {
value.setEnabled(true);
value.setTextColor(context.getResources().getColor(R.color.colorAccent));
}
}
}
Activity Class:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_expense);
Intent intent = getIntent();
if (intent.getExtras() != null) {
receipt = intent.getStringExtra("receipt");
Log.d("receiptIntent", receipt);
}
getReference();
}
void getReference() {
updateBtn = findViewById(R.id.update_expense_btn);
updateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
memberAmount = ((AdapterUpdateExpense)recyclerView.getAdapter()).getAmount();
Log.d("memberAmount", memberAmount.toString());
}
});
}
您最好实现 TextChangeListener,这样每当用户在编辑文本中编辑值时,您都可以将新编辑的值存储在列表项中的新变量或单独的 hashamp 中进行存储。
//Hashmap to store edited amount. Is static to access this in Activity class.
public static HashMap<Integer,String> newAmountHashMap = new HashMap<Integer, String>();
class holderMemberUpdate extends RecyclerView.ViewHolder{
TextView name;
EditText value;
holderMemberUpdate(View view) {
super(view);
name = view.findViewById(R.id.member_name_txtview);
value = view.findViewById(R.id.member_expense_edittxt);
value.addTextChangedListener(new MyCustomEditTextListener(this));
if(isEvenlyRadioChecked) {
value.setEnabled(false);
} else {
value.setEnabled(true);
value.setTextColor(context.getResources().getColor(R.color.colorAccent));
}
}
}
//文本变化监听器
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) {
}
@Override
public void afterTextChanged(Editable editable) {
newAmountHashMap.put(position, editable.toString());
}
}
最后,您应该在 Activity 中点击按钮处理 HashMap。
您需要在值 EditTexts 上设置一个 TextWatcher,它将设置 List<Object> items
内对象的值,它实际上不应该只是 Object
类型,而至少应该是一些抽象的 Member
使用 setAmount
方法输入。
private void configureHolderMemberUpdate(final holderMemberUpdate viewHolder, final int position) {
final MemberUpdate memberUpdate = (MemberUpdate) items.get(position);
if (memberUpdate != null) {
viewHolder.name.setText(memberUpdate.getTitle());
viewHolder.value.setText(memberUpdate.getAmount());
}
// Add this
viewHolder.value.addTextChangedListener(...
在文本观察器中,
items.get(position).setAmount(Double.parseDouble(text));
How to use the TextWatcher class in Android?
然后,编写一个方法来循环 items
并对这些值 求和 ,不引用任何视图,也不解析任何内容。
该方法可以写在适配器中,或者 activity,您将列表对象传递给 activity
我想将 EditText 的文本值从 RecyclerView 适配器发送到 Activity。在我的场景中,我需要在按下按钮时将 EditText 文本从适配器发送到 Activity(按钮在 Activity class 中,而不是在适配器中)。在 Adapter class、
的这段代码中viewHolder.value.setText(memberUpdate.getAmount());
我已经设置了 EditText 的值。现在我想在单击 Button 时从该适配器获取此值到 Activity class。要单击的按钮是 Activity class 中的 updateBtn = findViewById(R.id.update_expense_btn);
。请告诉我如何获取 Adapter class 到 Activity class.
适配器Class:
class AdapterUpdateExpense extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int MEMBERUPDATE = 4;
private List<Object> items;
private Context context;
private Activity activity;
private boolean isEvenlyRadioChecked;
private Double amount = 0.0;
AdapterUpdateExpense(Activity activity, Context context, List<Object> items, boolean isEvenlyRadioChecked) {
this.activity = activity;
this.context = context;
this.items = items;
this.isEvenlyRadioChecked = isEvenlyRadioChecked;
}
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof MemberUpdate) {
return MEMBERUPDATE;
}
return -1;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder holder = null;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
switch (viewType) {
case MEMBERUPDATE:
View v4 = inflater.inflate(R.layout.update_expense_layout, viewGroup, false);
holder = new holderMemberUpdate(v4);
break;
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
switch (viewHolder.getItemViewType()) {
case MEMBERUPDATE:
holderMemberUpdate view4 = (holderMemberUpdate) viewHolder;
configureHolderMemberUpdate(view4, position);
break;
}
}
private void configureHolderMemberUpdate(final holderMemberUpdate viewHolder, final int position) {
final MemberUpdate memberUpdate = (MemberUpdate) items.get(position);
if (memberUpdate != null) {
viewHolder.name.setText(memberUpdate.getTitle());
viewHolder.value.setText(memberUpdate.getAmount());
}
amount+= Double.valueOf(viewHolder.value.getText().toString());
Log.d("sdfsdfah", getAmount().toString());
}
class holderMemberUpdate extends RecyclerView.ViewHolder{
TextView name;
EditText value;
holderMemberUpdate(View view) {
super(view);
name = view.findViewById(R.id.member_name_txtview);
value = view.findViewById(R.id.member_expense_edittxt);
if(isEvenlyRadioChecked) {
value.setEnabled(false);
} else {
value.setEnabled(true);
value.setTextColor(context.getResources().getColor(R.color.colorAccent));
}
}
}
Activity Class:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_expense);
Intent intent = getIntent();
if (intent.getExtras() != null) {
receipt = intent.getStringExtra("receipt");
Log.d("receiptIntent", receipt);
}
getReference();
}
void getReference() {
updateBtn = findViewById(R.id.update_expense_btn);
updateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
memberAmount = ((AdapterUpdateExpense)recyclerView.getAdapter()).getAmount();
Log.d("memberAmount", memberAmount.toString());
}
});
}
您最好实现 TextChangeListener,这样每当用户在编辑文本中编辑值时,您都可以将新编辑的值存储在列表项中的新变量或单独的 hashamp 中进行存储。
//Hashmap to store edited amount. Is static to access this in Activity class.
public static HashMap<Integer,String> newAmountHashMap = new HashMap<Integer, String>();
class holderMemberUpdate extends RecyclerView.ViewHolder{
TextView name;
EditText value;
holderMemberUpdate(View view) {
super(view);
name = view.findViewById(R.id.member_name_txtview);
value = view.findViewById(R.id.member_expense_edittxt);
value.addTextChangedListener(new MyCustomEditTextListener(this));
if(isEvenlyRadioChecked) {
value.setEnabled(false);
} else {
value.setEnabled(true);
value.setTextColor(context.getResources().getColor(R.color.colorAccent));
}
}
}
//文本变化监听器
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) {
}
@Override
public void afterTextChanged(Editable editable) {
newAmountHashMap.put(position, editable.toString());
}
}
最后,您应该在 Activity 中点击按钮处理 HashMap。
您需要在值 EditTexts 上设置一个 TextWatcher,它将设置 List<Object> items
内对象的值,它实际上不应该只是 Object
类型,而至少应该是一些抽象的 Member
使用 setAmount
方法输入。
private void configureHolderMemberUpdate(final holderMemberUpdate viewHolder, final int position) {
final MemberUpdate memberUpdate = (MemberUpdate) items.get(position);
if (memberUpdate != null) {
viewHolder.name.setText(memberUpdate.getTitle());
viewHolder.value.setText(memberUpdate.getAmount());
}
// Add this
viewHolder.value.addTextChangedListener(...
在文本观察器中,
items.get(position).setAmount(Double.parseDouble(text));
How to use the TextWatcher class in Android?
然后,编写一个方法来循环 items
并对这些值 求和 ,不引用任何视图,也不解析任何内容。
该方法可以写在适配器中,或者 activity,您将列表对象传递给 activity