从 linearLayout 中动态生成的多个微调器获取数据

Get data from multiple spinners generated dynamically in linearLayout

我正在尝试在我的 LinearLayout 中添加一个动态视图,并且 正在尝试实现类似捕获与时间对应的每个微调器值的东西 。这里的任何人都可以指导我如何完成。 我正在尝试,但它无法正常工作,因为根据点击“添加文件”按钮可以有无限多的行和微调器。我需要从每个旋转器收集值,然后需要创建一个数组。

这是我的代码 :

    public class MainActivity extends Activity {
    private LinearLayout parentLinearLayout;
    private EditText mEditText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        parentLinearLayout=(LinearLayout) findViewById(R.id.parent_linear_layout);
    }
    public void onAddField(View v) {
        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View rowView=inflater.inflate(R.layout.container_item, null);
        final EditText text1 = (EditText) rowView.findViewById(R.id.number_edit_text);
        final EditText text2 = (EditText) rowView.findViewById(R.id.number_edit_text2);
        final EditText text3 = (EditText) rowView.findViewById(R.id.number_edit_text3);

        text1.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    text3.setText(text1.getText().toString());
                  Toast.makeText(MainActivity.this,""+s.toString(),Toast.LENGTH_LONG).show();
                }
            }
        });
        text2.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    int val = Integer.parseInt(text1.getText().toString());
                    int val2 = Integer.parseInt(text2.getText().toString());
                    if(val2>val)
                    {

                    }else{
                        int finalval=val-val2;
                        text3.setText(""+finalval);
                    }


                    Toast.makeText(MainActivity.this,""+s.toString(),Toast.LENGTH_LONG).show();
                }
            }
        });

        text3.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    Toast.makeText(MainActivity.this,""+s.toString(),Toast.LENGTH_LONG).show();
                }
            }
        });


       parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount());
    }
    public void onDelete(View v) {
        parentLinearLayout.removeView((View) v.getParent());
    }
    public void onGetField(View v){
        int count = parentLinearLayout.getChildCount();
        for (int i = 0; i < count; i++) {
            final View row = parentLinearLayout.getChildAt(i);
            EditText textOut = (EditText) row.findViewById(R.id.number_edit_text);
            String data = textOut.getText().toString();
            Toast.makeText(this,""+data,Toast.LENGTH_LONG).show();
        }
    }
}

动态视图XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal">
    <EditText
        android:id="@+id/number_edit_text"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".2"
        android:inputType="phone"/>
    <EditText
        android:id="@+id/number_edit_text2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".2"
        android:inputType="phone"/>
    <EditText
        android:id="@+id/number_edit_text3"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".2"
        android:inputType="phone"/>
    <Spinner
        android:id="@+id/type_spinner"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight=".3"
        android:entries="@array/types"
        android:gravity="right" />
    <Button
        android:id="@+id/delete_button"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight=".1"
        android:background="@android:drawable/ic_delete"
        android:onClick="onDelete"/>
</LinearLayout>

主要XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp"
    android:orientation="vertical">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:id="@+id/parent_linear_layout"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>
    <Button
        android:id="@+id/add_field_button"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="#555"
        android:layout_gravity="center"
        android:onClick="onAddField"
        android:textColor="#FFF"
        android:text="Add Field"
        android:paddingLeft="5dp"/>
    <Button
        android:id="@+id/get_field_button"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="#555"
        android:layout_gravity="center"
        android:onClick="onGetField"
        android:textColor="#FFF"
        android:text="Get Field"
        android:paddingLeft="5dp"/>
</LinearLayout>

请让我知道您对此的宝贵建议。我从最后一天就卡住了。

这是附加的图片,在图片中你可以看到第三个编辑文本是空的,我需要在第一个上使用文本观察器填充它,两个编辑文本,如 2(first edit-text)-1(第二个编辑文本)= 1(第三个编辑文本)。

此致

下面是第二种使用 Recyclerview 的方法:

MainActivity:

public class MainActivity extends AppCompatActivity {
    int position=0;
    List<Container_Add_model> main_modelList = new ArrayList<>();
    RecyclerView recyclerView_container;
    TextView Tv_add_container;
    Container_Add_Adapter rvAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        recyclerView_container = findViewById(R.id.recyclerView_container);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView_container.setLayoutManager(layoutManager);
        Tv_add_container = findViewById(R.id.Tv_add_container);


        rvAdapter = new Container_Add_Adapter(MainActivity.this, main_modelList,this, new Container_Add_Adapter.Onclick() {
            @Override
            public void onEvent(Container_Add_model model, int pos) {

            }
        });
        recyclerView_container.setAdapter(rvAdapter);


        Tv_add_container.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                rvAdapter.addClick();

            }
        });

    }

适配器Class:

public class Container_Add_Adapter extends RecyclerView.Adapter<Container_Add_Adapter.RvViewHolder> {
    Activity context;
    List<Container_Add_model> models;
    Onclick onclick;
    View view;
    EditTextAdded editTextAdded;
    private int container_number_pending, container_number_taken, container_number_given;

    public Container_Add_Adapter(Activity context, List<Container_Add_model> models,EditTextAdded editTextAdded, Onclick onclick) {
        this.context = context;
        this.models = models;
        this.editTextAdded = editTextAdded;
        this.onclick = onclick;
    }

    @Override
    public Container_Add_Adapter.RvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        view = inflater.from(parent.getContext()).inflate(R.layout.container_item, parent, false);
        RvViewHolder rvViewHolder = new RvViewHolder(view);
        return rvViewHolder;
    }

    @Override
    public void onBindViewHolder(final Container_Add_Adapter.RvViewHolder holder, final int position) {
        final Container_Add_model model = models.get(position);

        holder.Edttxt_given_container.setText(models.get(position).container_given+"");
        holder.Edttxt_given_container.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    // models.get(position).container_given = Integer.valueOf(s.toString());
                }
            }
        });


        holder.Edttxt_taken_container.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() != 0) {
                    if (!holder.Edttxt_given_container.getText().toString().isEmpty()) {

                        container_number_given = Integer.parseInt(holder.Edttxt_given_container.getText().toString());
                        int number = container_number_given + container_number_pending;

                        int input_num = Integer.parseInt(s.toString());
                        if (number >= input_num) {
                            container_number_taken = Integer.parseInt(holder.Edttxt_taken_container.getText().toString());
                            int final_num = number - container_number_taken;
                            holder.Edttxt_Pending_container.setText("" + final_num);
                        } else {
                            holder.Edttxt_taken_container.setText("");
                        }
                    } else {
                        holder.Edttxt_taken_container.setText("");
                    }

                } else {
                    if (!holder.Edttxt_given_container.getText().toString().isEmpty()) {
                        container_number_given = Integer.parseInt(holder.Edttxt_given_container.getText().toString());
                        if (container_number_given > 0) {
                            int finalnum = container_number_given + container_number_pending;
                            holder.Edttxt_Pending_container.setText("" + finalnum);
                        } else {
                            holder.Edttxt_Pending_container.setText("" + container_number_pending);
                        }
                    } else {
                        holder.Edttxt_Pending_container.setText("" + container_number_pending);
                    }

                }
            }
        });


        holder.Iv_delete_container.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                models.remove(position);
                notifyItemChanged(position);
                notifyItemRangeChanged (position, models.size());
            }
        });
    }


    public void addClick(){
        Container_Add_model container_main_model = new Container_Add_model();
        container_main_model.setContainer_given(0);
        container_main_model.setContainer_pending(0);
        container_main_model.setContainer_taken(0);
        container_main_model.setContainer_id(models.size());
        container_main_model.setContainer_name("");

        models.add(container_main_model);
        //notifyDataSetChanged(models);
        notifyItemInserted(models.size() + 1);

    }



    @Override
    public int getItemCount() {
        return models.size();
    }

    public interface Onclick {
        void onEvent(Container_Add_model model, int pos);
    }

    public class RvViewHolder extends RecyclerView.ViewHolder {
        TextView Tv_container_type;
        EditText Edttxt_given_container, Edttxt_taken_container, Edttxt_Pending_container;
        LinearLayout llItem;
        ImageView Iv_delete_container;

        public RvViewHolder(View itemView) {
            super(itemView);
            Tv_container_type = itemView.findViewById(R.id.Tv_container_type);
            Iv_delete_container = itemView.findViewById(R.id.Iv_delete_container);
            Edttxt_given_container = itemView.findViewById(R.id.Edttxt_given_container);
            Edttxt_Pending_container = itemView.findViewById(R.id.Edttxt_Pending_container);
            Edttxt_taken_container = itemView.findViewById(R.id.Edttxt_taken_container);


        }
    }
}

将您的 String 数组转换为 ArrayList 并将其传递给 Adapter 并使用以下代码或使用您的 String[] 更改以下代码。

您需要为您的适配器实现 Filterable class 并覆盖 getFilter()

public class ListFilterActivity extends ListActivity {

    private List<String> list = new ArrayList<String>();
    List<String> mOriginalValues;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final MyAdapter adapter = new MyAdapter(this, getModel());
        setListAdapter(adapter);

        EditText filterEditText = (EditText) findViewById(R.id.filterText);

        // Add Text Change Listener to EditText
        filterEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // Call back the Adapter with current character to Filter
                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }

    private List<String> getModel() {
        list.add("Linux");
        list.add("Windows7");
        list.add("Suse");
        list.add("Eclipse");
        list.add("Ubuntu");
        list.add("Solaris");
        list.add("Android");
        list.add("iPhone");
        list.add("Windows XP");
        return list;
    }
}

// Adapter Class
public class MyAdapter extends BaseAdapter implements Filterable {

    List<String> arrayList;
    List<String> mOriginalValues; // Original Values
    LayoutInflater inflater;

    public MyAdapter(Context context, List<String> arrayList) {
        this.arrayList = arrayList;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return arrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    private class ViewHolder {
        TextView textView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;

        if (convertView == null) {

            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.row, null);
            holder.textView = (TextView) convertView
            .findViewById(R.id.textview);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.textView.setText(arrayList.get(position));
        return convertView;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,FilterResults results) {

                arrayList = (List<String>) results.values; // has the filtered values
                notifyDataSetChanged();  // notifies the data with new filtered values
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                List<String> FilteredArrList = new ArrayList<String>();

                if (mOriginalValues == null) {
                    mOriginalValues = new ArrayList<String>(arrayList); // saves the original data in mOriginalValues
                }

                /********
                *
                *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
                *  else does the Filtering and returns FilteredArrList(Filtered)
                *
                ********/
                if (constraint == null || constraint.length() == 0) {

                    // set the Original result to return
                    results.count = mOriginalValues.size();
                    results.values = mOriginalValues;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < mOriginalValues.size(); i++) {
                        String data = mOriginalValues.get(i);
                        if (data.toLowerCase().startsWith(constraint.toString())) {
                            FilteredArrList.add(data);
                        }
                    }
                    // set the Filtered result to return
                    results.count = FilteredArrList.size();
                    results.values = FilteredArrList;
                }
                return results;
            }
        };
        return filter;
    }
}

这是你遗漏的 :

public class MainActivity extends Activity {
    private LinearLayout parentLinearLayout;
    private ArrayList<> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        parentLinearLayout=(LinearLayout) findViewById(R.id.parent_linear_layout);
    }
    public void onAddField(View v) {
        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        final View rowView=inflater.inflate(R.layout.container_item, null);
        final EditText text1 = (EditText) rowView.findViewById(R.id.number_edit_text);
        final EditText text2 = (EditText) rowView.findViewById(R.id.number_edit_text2);
        final EditText text3 = (EditText) rowView.findViewById(R.id.number_edit_text3);
        final Spinner mSpinner = (Spinner) rowView.findViewById(R.id.type_spinner);

        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
               String selectedDiv = parent.getItemAtPosition(position).toString();
                Toast.makeText(MainActivity.this, ""+selectedDiv, Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {
                // can leave this empty
            }
        });

        text1.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    text3.setText(text1.getText().toString());
                  Toast.makeText(MainActivity.this,""+s.toString(),Toast.LENGTH_LONG).show();
                }
            }
        });
        text2.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    int val = Integer.parseInt(text1.getText().toString());
                    int val2 = Integer.parseInt(text2.getText().toString());
                    if(val2>val)
                    {

                    }else{
                        int finalval=val-val2;
                        text3.setText(""+finalval);
                    }


                    Toast.makeText(MainActivity.this,""+s.toString(),Toast.LENGTH_LONG).show();
                }
            }
        });

        text3.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if (s.length() > 0) {
                    Toast.makeText(MainActivity.this,""+s.toString(),Toast.LENGTH_LONG).show();
                }
            }
        });


       parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount());
    }
    public void onDelete(View v) {
        parentLinearLayout.removeView((View) v.getParent());

    }
    public void onGetField(View v){
        mList = new ArrayList<>();
        int count = parentLinearLayout.getChildCount();
        for (int i = 0; i < count; i++) {
            final View row = parentLinearLayout.getChildAt(i);
            EditText textOut = (EditText) row.findViewById(R.id.number_edit_text);
            EditText textOut2 = (EditText) row.findViewById(R.id.number_edit_text2);
            EditText textOut3 = (EditText) row.findViewById(R.id.number_edit_text3);
            Spinner spinner = (Spinner)row.findViewById(R.id.type_spinner);
            mList.add(new DataList( textOut.getText().toString(),
                    textOut2.getText().toString()
                    , textOut3.getText().toString(),spinner.getSelectedItem().toString()
            ));

        }
    }
}

数据列表模型 :

public class DataList {

    public String given;

    public String taken;

    public String pending;

    public String spinnerItemSelected;

    public DataList(String given, String taken, String pending, String spinnerItemSelected) {
        this.given = given;
        this.taken = taken;
        this.pending = pending;
        this.spinnerItemSelected = spinnerItemSelected;
    }
}