1

我为此搜索了很多,但没有结果。我有一个自定义 ListView,每个元素都有几个 TextViews 和 3 个 Spinners 和按钮。当我在微调器上设置值并按下按钮时,我想从这些微调器中获取选定的值并将它们发送到服务器。从顶部到最后一个可见元素的列表元素一切正常,但在不可见或半可见的项目上发生了 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;
        }

创建:

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)
                }

            }
        });
4

1 回答 1

1

我在谷歌上搜索了 2 天,最后决定在这里发帖,但 1 小时后我在这里找到了解决方案。像这样更改所有微调器:

Spinner t1 = (Spinner) parent.getChildAt(position-parent.parent.getFirstVisiblePosition()).findViewById(R.id.lista_termin1);
于 2019-12-01T13:17:49.003 回答