来自Spinner的自定义ListView元素中的getSelectedItem

问题描述 投票:0回答:1

我为此做了很多Google搜索,没有结果。我有一个自定义的ListView,每个元素都有几个TextViews和3个Spinners和按钮。当我在微调器上设置值并按一个按钮时,我想从这些微调器中获取选择的值并将其发送到服务器。对于从顶部到最后一个可见元素的列表元素,一切正常,但对于不可见或有一半可见的项目,则发生2件坏事。

如果我更改微调器上的值,请按按钮进行保存,这取决于我在哪个元素上进行处理,有2件事发生:

  1. 如果元素是一半,或在活动负载下可见,并且我在这些步骤上执行了这些步骤,那么传递的值就是我更改它之前设置的值。

  2. 如果根本不可见该元素,并且我对其执行了步骤,则应用程序崩溃,NullPointerException将错误链接到Spinner的声明。

代码:

适配器:

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

            StudentList students = studentList.get(position);

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
            final View view = inflater.inflate(R.layout.student_list, null);

            TextView id = (TextView) view.findViewById(R.id.list_id);
            TextView name = (TextView) view.findViewById(R.id.list_name);
            TextView surname = (TextView) view.findViewById(R.id.list_surname);
            Spinner t1 = (Spinner) view.findViewById(R.id.list_t1);
            Spinner t2 = (Spinner) view.findViewById(R.id.list_t2);
            Spinner t3 = (Spinner) view.findViewById(R.id.list_t3);
            TextView final = (TextView) view.findViewById(R.id.list_final);
            Button save = (Button) view.findViewById(R.id.save);

            id.setText(students.getId());
            name.setText(students.getName());
            surname.setText(students.getSurname());
            final.setText(students.getFinal());

            for (int i=0;i<t1.getCount();i++){
                if (t1.getItemAtPosition(i).toString().equalsIgnoreCase(students.getT1())){
                    t1.setSelection(i);
                }
            }
            for (int i=0;i<t2.getCount();i++) {
                if (t2.getItemAtPosition(i).toString().equalsIgnoreCase(students.getT2())) {
                    t2.setSelection(i);
                }
            }

            for (int i=0;i<t3.getCount();i++){
                if (t3.getItemAtPosition(i).toString().equalsIgnoreCase(students.getT3())){
                    t3.setSelection(i);
                }
            }

            if(t1.getSelectedItemPosition() > 1){
                t2.setEnabled(false);
                t3.setEnabled(false);
            } else if (t2.getSelectedItemPosition() > 1){
                t3.setEnabled(false);
            }

            save.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    ((ListView) parent).performItemClick(v, position, 0);
                }
            });        



            if(studentList.get(position).getProtokol().equals("open")){

            } else {
                t1.setEnabled(false);
                t2.setEnabled(false);
                t3.setEnabled(false);
                save.setEnabled(false);
            }


            return view;
        }

onCreate:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                long viewId = view.getId();

                Spinner t1 = (Spinner) parent.getChildAt(position).findViewById(R.id.lista_termin1);//There the app crashes if I do things I described above
                Spinner t2 = (Spinner) parent.getChildAt(position).findViewById(R.id.lista_termin2);
                Spinner t3 = (Spinner) parent.getChildAt(position).findViewById(R.id.lista_termin3);  

                if (viewId == R.id.save) {
                        String t1Itemn = t1.getSelectedItem());
                        String t2Itemn = t2.getSelectedItem());
                        String t3Itemn = t3.getSelectedItem());
                        //Code that sends those string to the server based on urlConnection - works perfectly fine)
                }

            }
        });
java android listview spinner
1个回答
0
投票

我进行了2天的谷歌搜索,最终决定在此处发布信息,但是1小时后,我找到了解决方案here。更改了所有微调器,如下所示:

Spinner t1 = (Spinner) parent.getChildAt(position-parent.parent.getFirstVisiblePosition()).findViewById(R.id.lista_termin1);
© www.soinside.com 2019 - 2024. All rights reserved.