如何从所有RecyclerView EditTexts获取数据

时间:2018-02-16 14:46:32

标签: android android-recyclerview

我的应用程序中有一个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>

2 个答案:

答案 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类用于在连接大量字符串时改善性能。 您可以按如下方式使用它:

  1. 初始化:StringBuilder builder = new StringBuilder();。您还可以在构造函数中包含初始String或CharSequence,或指定容量。
  2. 连接:您可以使用builder.append()将新项目插入构建器。此方法不仅接受字符串,还接受其他数据类型,例如intchar等。
  3. 使用builder.toString()将其转换为字符串。
  4. 有关详细信息,请参阅this tutorialthe official documentation