从自定义 ListView 元素中的 Spinner getSelectedItem
getSelectedItem from Spinner inside custom ListView element
我在谷歌上搜索了很多,但没有结果。我有一个自定义的 ListView,每个元素都有几个 TextView 和 3 个 Spinners 和按钮。当我在微调器上设置值并按下按钮时,我想从这些微调器中获取选择的值并将它们发送到服务器。对于从顶部到最后一个可见元素的列表元素,一切正常,但对于不可见或一半不可见的项目,会发生 2 件坏事。
如果我更改微调器上的值,按按钮保存,根据我处理的元素会发生 2 件事:
如果元素是一半,或者在 activity 加载时有点可见,并且我对其执行了这些步骤,则传递的值是我更改它之前设置的值。
如果元素根本不可见并且我对其执行了步骤应用程序崩溃并出现 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)
}
}
});
我谷歌了 2 天,最后决定 post 这里,但 1 小时后我找到了解决方案 here。像这样更改了所有微调器:
Spinner t1 = (Spinner) parent.getChildAt(position-parent.parent.getFirstVisiblePosition()).findViewById(R.id.lista_termin1);