我的应用程序中有一个RecyclerView,它包含两个按钮。一个项目(两个EditTexts)添加到RecyclerView,另一个用于获取在EditTexts中输入的值并将它们发送到另一个活动。 RecyclerView中的项目数量取决于用户的需求。而且我不知道如何获取用户在这些EditTexts中输入的所有值并将它们发送到另一个活动 (EditTexts只获取numberDecimal类型,我想对值进行一些数学运算)
更新:添加了EntryData和MainActivity类。
适配器:
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.DataViewHolder> {
private Context context;
private List<EntryData> datas = new ArrayList<>();
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.item_surface, parent, false);
return new DataViewHolder(view);
}
@Override
public void onBindViewHolder(DataViewHolder holder, int position) {
holder.bindData(datas.get(position));
}
@Override
public int getItemCount() {
return datas.size();
}
public static class DataViewHolder extends RecyclerView.ViewHolder {
private EditText lengthEditText;
private EditText diameterEditText;
public DataViewHolder(View itemView) {
super(itemView);
lengthEditText = itemView.findViewById(R.id.tv_item_length);
diameterEditText = itemView.findViewById(R.id.tv_item_diameter);
}
public void bindData(EntryData entryData) {
lengthTextView.setText(entryData.getLength());
diameterTextView.setText(entryData.getDiameter());
}
}
public void addData(EntryData entryData) {
datas.add(entryData);
notifyItemInserted(datas.size() - 1);
}
}
EntryData类:
public class EntryData {
private String length;
private String diameter;
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getDiameter() {
return diameter;
}
public void setDiameter(String diameter) {
this.diameter = diameter;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViews();
}
private void setupViews() {
RecyclerView recyclerView= findViewById(R.id.rv_main_data);
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
final DataAdapter adapter= new DataAdapter();
recyclerView.setAdapter(adapter);
Button addDataButton = findViewById(R.id.btn_main_addData);
addDataButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EntryData entryData = new EntryData();
adapter.addData(entryData);
}
});
}
}
item_surface.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_weight="2">
<EditText
android:id="@+id/tv_item_length"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="length"
android:gravity="center"
android:layout_marginTop="4dp"
android:inputType="numberDecimal"
android:layout_marginLeft="4dp"
android:layout_marginRight="2dp"
android:layout_weight="1"/>
<EditText
android:id="@+id/tv_item_diameter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:hint="diameter"
android:gravity="center"
android:layout_marginTop="4dp"
android:layout_marginRight="4dp"
android:layout_marginLeft="2dp"
android:layout_weight="1"/>
</LinearLayout>
答案 0 :(得分:1)
将TextWatchListener添加到EditText(在bindData处),以便为正在编辑的字段更新自身的相对EntryData,这将保留对象上的数据。
更新对象后,您只需将Adapter#datas字段作为List循环,然后使用所有值执行所需的操作。
答案 1 :(得分:1)
我的解决方案与@MarcosVasconcelos发布的解决方案相同。这是一些代码:
在DataViewHolder类中:
public void bindData(final EntryData entryData) {
lengthTextView.setText(entryData.getLength());
diameterTextView.setText(entryData.getDiameter());
lengthTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
entryData.setLength(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
diameterTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
entryData.setDiameter(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
如您所见,您所要做的就是在每个EditTexts上设置TextWatcher。在onTextChanged
方法中,将EditText的当前文本分配给正确的EntryData。
在DataAdapter类中:
public List<EntryData> getData() {
return datas;
}
datas
列表的Getter方法。
最后,您需要做的就是向MainActivity添加一个Button,并在其上设置一个OnClickListener,从适配器获取datas
List,然后从每个EntryData对象中获取必要的值,如下所示:
private void setupViews() {
// Your other code
Button listDataButton = (Button) findViewById(R.id.btn_listData);
listDataButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<EntryData> data = adapter.getData();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < data.size(); i++) {
EntryData entryData = data.get(i);
builder.append(i)
.append("\n")
.append("Diameter: ")
.append(entryData.getDiameter())
.append("\n")
.append("Length: ")
.append(entryData.getLength())
.append("\n");
}
Log.i("MainActivity", builder.toString());
}
});
修改:StringBuilder
的简要说明:
StringBuilder
类用于在连接大量字符串时改善性能。
您可以按如下方式使用它:
StringBuilder builder = new StringBuilder();
。您还可以在构造函数中包含初始String或CharSequence,或指定容量。builder.append()
将新项目插入构建器。此方法不仅接受字符串,还接受其他数据类型,例如int
,char
等。builder.toString()
将其转换为字符串。有关详细信息,请参阅this tutorial和the official documentation。