【问题标题】:How to get data from all RecyclerView EditTexts如何从所有 RecyclerView EditTexts 中获取数据
【发布时间】:2018-02-16 14:46:32
【问题描述】:

我的应用程序中有一个 RecyclerView,其中包含两个按钮。一个向 RecyclerView 添加一个项目(两个 EditTexts),另一个用于获取在 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>

【问题讨论】:

  • 您能否更新您的问题以包含 EntryData 类文件?
  • 以及包含recyclerview的类的代码
  • @Larpee 添加了课程
  • @karique 完成...
  • 您是否愿意使用双向 Android 数据绑定?它可能会使这变得容易得多。

标签: android android-recyclerview


【解决方案1】:

将 TextWatchListener 添加到 EditText(在 bindData 处),这样它就可以为您正在编辑的字段更新其自身的相对 EntryData,这将保留对象上的数据。

随着对象的更新,您只需将 Adapter#datas 字段作为列表循环并使用所有值执行您想要的操作。

【讨论】:

    【解决方案2】:

    我的解决方案与@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) {
    
                }
            });
        }
    

    如您所见,您所要做的就是在每个 EditText 上设置一个 TextWatcher。在onTextChanged 方法中,您将EditText 的当前文本分配给正确的EntryData。

    在 DataAdapter 类中:

    public List<EntryData> getData() {
        return datas;
    }
    

    datas 列表的 Getter 方法。

    最后,您所要做的就是向 MainActivity 添加一个 Button 并在其上设置一个 OnClickListener 以从适配器获取 datas 列表,然后从每个 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()将其转换为字符串。

    请参阅this tutorialthe official documentation 了解更多信息。

    【讨论】:

    • 您能简单解释一下StringBuilder 的工作原理吗?
    • @Hamed 我用你的问题的答案和几个有用的链接更新了我的答案。如有任何其他问题,请随时提出
    • 正如我在主要问题中所说,我想对另一个 Activity 中的数据进行一些数学运算,并在 TextView 中显示结果。我使用intent.putExtrabuilder.toString() 传递给下一个活动。但是我怎样才能提取这些数字并对它们做我想做的事情呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2020-09-13
    相关资源
    最近更新 更多