【问题标题】:How to get the values of all the elements in a list view when a button outside the listview is pressed按下列表视图外的按钮时如何获取列表视图中所有元素的值
【发布时间】:2015-04-09 06:15:31
【问题描述】:

我的列表视图的每一行都由一个 TextView 和一个 EditText 组成,并且我在 ListView 之外有一个按钮。单击该按钮时,我想检索所有 ExitText 值。

我在 DialogFragment 中生成了 ListView。这是我要完成的 saveButton onClick。这是我的代码。任何帮助将不胜感激。

public class SubVitalsEntryDialogFragment extends DialogFragment {

    ArrayList<SubVitals> subVitalList = new ArrayList<SubVitals>();
    ListView mylist;
    Button saveButton;
    Button cancelButton;
    EditText entryEditText;

    public static SubVitalsEntryDialogFragment newInstance(ArrayList<SubVitals> sub) {
        SubVitalsEntryDialogFragment f = new SubVitalsEntryDialogFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putParcelableArrayList("subVitalList", sub);
        f.setArguments(args);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.subvitals_dialog_layout, null, false);
        mylist = (ListView) view.findViewById(R.id.vitalEntryListView);
        saveButton = (Button) view.findViewById(R.id.entrySaveButton);
        cancelButton = (Button) view.findViewById(R.id.entryCancelButton);
        //getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().setTitle("Enter your vitals");

        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getDialog().dismiss();
            }
        });

        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ///??????????

            }
        });
        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);
        subVitalList = getArguments().getParcelableArrayList("subVitalList");
        ArrayAdapter<SubVitals> adapter = new MyListAdapter(subVitalList);
        mylist.setAdapter(adapter);

    }

    private class MyListAdapter extends ArrayAdapter<SubVitals>{

        public MyListAdapter(ArrayList<SubVitals> subVitalList){

            super(getActivity(), R.layout.subvitals_dialog_layout, subVitalList);
            Log.d("Tag", "super okay");
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = convertView;
            if (itemView == null)
                itemView = LayoutInflater.from(this.getContext()).inflate(R.layout.sub_vital_template, parent, false);

            String currentVital = subVitalList.get(position).getSubVitalName();

            //Fill the view

            TextView vitalText = (TextView) itemView.findViewById((R.id.vitalEntryTextView));
            vitalText.setText(currentVital);

            return itemView;
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return subVitalList.size();
        }
    }

}

-------------编辑------

public class SubVitalsEntryDialogFragment extends DialogFragment {

    ArrayList<SubVitals> subVitalList = new ArrayList<SubVitals>();
    ListView mylist;
    Button saveButton;
    Button cancelButton;
    EditText entryEditText;
    List<String> vitalsEntered = new ArrayList<>();
    private HashMap<String, String> textValues = new HashMap<String, String>();

    public static SubVitalsEntryDialogFragment newInstance(ArrayList<SubVitals> sub) {
        SubVitalsEntryDialogFragment f = new SubVitalsEntryDialogFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putParcelableArrayList("subVitalList", sub);
        f.setArguments(args);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.subvitals_dialog_layout, null, false);
        mylist = (ListView) view.findViewById(R.id.vitalEntryListView);
        saveButton = (Button) view.findViewById(R.id.entrySaveButton);
        cancelButton = (Button) view.findViewById(R.id.entryCancelButton);
        //getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().setTitle("Enter your vitals");

        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getDialog().dismiss();
            }
        });

        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("SAVE INSIDE","OK");
                for (Map.Entry<String,String> entry : textValues.entrySet()) {
                    String key = entry.getKey();
                    String value = entry.getValue();
                    Log.d("HASHCHECK","Key: " + key + " Value" + value);
                    // do stuff
                }


            }
        });
        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);
        subVitalList = getArguments().getParcelableArrayList("subVitalList");
        ArrayAdapter<SubVitals> adapter = new MyListAdapter(subVitalList);
        mylist.setAdapter(adapter);

    }

    private class MyListAdapter extends ArrayAdapter<SubVitals>{



        public MyListAdapter(ArrayList<SubVitals> subVitalList){

            super(getActivity(), R.layout.subvitals_dialog_layout, subVitalList);
            Log.d("Tag", "super okay");
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //return super.getView(position, convertView, parent);
            //Making sure we've a view to work with(may have been given null
            Log.d("TAG","Inside get view");
            View itemView = convertView;
            boolean convertViewWasNull = false;

            if (itemView == null){
                itemView = LayoutInflater.from(this.getContext()).inflate(R.layout.sub_vital_template, parent, false);
            convertViewWasNull = true;
            }

            TextView vitalText = (TextView) itemView.findViewById((R.id.vitalEntryTextView));
            EditText vitalEditText = (EditText) itemView.findViewById(R.id.vitalEntryEditText);

            if(convertViewWasNull ){
                vitalEditText.addTextChangedListener(new GenericTextWatcher(vitalEditText));
            }

            String currentVital = subVitalList.get(position).getSubVitalName();

            //Fill the view

            vitalText.setText(currentVital);
            return itemView;

        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return subVitalList.size();
        }

        private class GenericTextWatcher implements TextWatcher {

            private View view;
            private GenericTextWatcher(View view) {
                this.view = view;
            }

            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

            public void afterTextChanged(Editable editable) {

                String text = editable.toString();
                //save the value for the given tag :
                textValues.put(view.getTag().toString(), editable.toString());
            }
        }

    }

}

【问题讨论】:

  • Adapter中EditText相关代码在哪里?
  • EditText 在填充 ListView 时未采用任何值。所以我没有在适配器中使用它。
  • 据我所知,您可以对EditTextEditTextString 进行静态创建。当您单击按钮时,只需将所有 EditTexts 字符串一起调用,例如 Adapter.edittext_value
  • @AnshulTyagi 对不起,我不明白。你能解释一下你的答案吗?
  • 您的问题是说您有 textview 和 edittext 并且 adpater 中没有定义 edittext。破坏代码............

标签: java android


【解决方案1】:

不要使用ListView。它不是为此类目的而设计的。 ListView 中的行被回收,滚动时可能会丢失已经输入的数据。请改用LinearLayout。这样您就可以直接访问其中的视图。

【讨论】:

  • 我使用 ListView 因为内容是动态生成的。
  • 您可以动态(以编程方式)将视图添加到LinearLayout。使用ListView会给你带来很多麻烦。它旨在显示可滚动的数据,而不是用于动态加载的输入字段。此外,据我所知,在某些设备上使用ListView 中的EditText 时出现问题 - 键盘未显示。
  • 那么,除了改变一切,别无选择?
  • 你可以做到,但我认为这不是正确的方法。您可以将TextWatchers 添加到EditText 视图中,该视图将输入的数据填充到某个临时变量(适当的数据结构)当用户单击保存按钮时,数据取自临时变量变量并设置为您的数据(保存到数据库、通过 Internet 发送等)。如果您还有其他问题,请不要犹豫:)
  • @HeisenBerg,如果我的回答对您有所帮助,请问您是否接受它作为正确的回答:)
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多