如何从ListView中的多个Spinner中获取String值?
How to get the String value from multiple Spinner in ListView?
我有一个 ListView,在 ListView 的每一行上我都有一个 Spinner。
在拥有上述 ListView 的 MainActivity 中,我有一个提交按钮
我希望当用户在 ListView 的每个 Spinner 上完成选择值时,他们按下 buttonSubmit,buttonSubmit 的侦听器将获取 ListView 的每个 Spinner 的所有值并将它们推送到 SQLiteDatabase。
我的问题是,buttonSubmit 不在 ListView 的 class CustomAdapter 中,它位于拥有 ListView 的 MainActivity 中。
因此,当用户单击
按钮提交
这是我的代码:
* ListView的自定义适配器代码class,每行有一个Spinner :
public class ChonLopTheoMonAdapter extends ArrayAdapter<MonHocDTO> implements AdapterView.OnItemSelectedListener{
Context context;
int layout;
ArrayList<MonHocDTO> listMonHoc;
ArrayAdapter<String> adapterSpinner;
String[] listLop;
public ChonLopTheoMonAdapter(Context context, int layout, ArrayList<MonHocDTO> listMonHoc) {
super(context, layout, listMonHoc);
this.context = context;
this.layout = layout;
this.listMonHoc = listMonHoc;
}
public class ViewHolder {
TextView txtTenMonHoc_ChonMon;
Spinner spChonLop;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(this.layout, parent, false);
holder = new ViewHolder();
holder.txtTenMonHoc_ChonMon = (TextView) convertView.findViewById(R.id.txtTenMonHoc_ChonMon);
holder.spChonLop = (Spinner) convertView.findViewById(R.id.spChonLop);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
holder.txtTenMonHoc_ChonMon.setText(this.listMonHoc.get(position).getTenMonHoc());
switch (this.listMonHoc.get(position).getIdMonHoc()){
case "QTM":
listLop = this.context.getResources().getStringArray(R.array.QTM);
break;
case "CTDL":
listLop = this.context.getResources().getStringArray(R.array.CTDL);
break;
case "TCC":
listLop = this.context.getResources().getStringArray(R.array.TCC);
break;
}
adapterSpinner = new ArrayAdapter<String>(this.context,android.R.layout.simple_spinner_item,listLop);
adapterSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
holder.spChonLop.setAdapter(adapterSpinner);
holder.spChonLop.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
return convertView;
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
*拥有listView的MainActivity代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
ListView lvChonLopTheoMonHoc;
Button btnXacNhanChonLop;
MonHocDAO monHocDAO;
ArrayList<MonHocDTO> listMonHoc;
ChonLopTheoMonAdapter chonLopTheoMonAdapter;
TypedArray thuTuMonHoc;
String[] tenMonHoc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addControls();
}
private void addControls() {
monHocDAO = new MonHocDAO(MainActivity.this);
lvChonLopTheoMonHoc = (ListView) findViewById(R.id.lvChonLopTheoMonHoc);
btnXacNhanChonLop = (Button) findViewById(R.id.btnXacNhanChonLop);
listMonHoc = new ArrayList<>();
listMonHoc = monHocDAO.layListMonHoc("NAM11");
chonLopTheoMonAdapter = new ChonLopTheoMonAdapter(MainActivity.this, R.layout.layout_chon_mon_hoc_theo_lop, listMonHoc);
chonLopTheoMonAdapter.notifyDataSetChanged();
lvChonLopTheoMonHoc.setAdapter(chonLopTheoMonAdapter);
btnXacNhanChonLop.setOnClickListener(MainActivity.this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnXacNhanChonLop:
break;
}
}
}
请帮助我:(
*这是 UI:
enter image description here
你的架构有点破。您不会将数据保存在任何地方,因此实际上无法全部检索。您的数据模型需要反映在 ListView
中显示的数据,并且当用户更改数据(通过在 Spinner
中选择某些内容)时,您需要对 onItemSelected()
回调做出反应通过使用用户选择的项目更新您的数据模型。假设 Activity
将对数据的引用传递给您的适配器,Activity
可以一直访问更新的数据。
onItemSelected() 使用这个
spinner.getSelectedItem().toString();
获取所选项目。为了能够使用 MainActvity 中的值尝试使用 SharedPreferences 来保存所选项目的值。
我有一个 ListView,在 ListView 的每一行上我都有一个 Spinner。 在拥有上述 ListView 的 MainActivity 中,我有一个提交按钮 我希望当用户在 ListView 的每个 Spinner 上完成选择值时,他们按下 buttonSubmit,buttonSubmit 的侦听器将获取 ListView 的每个 Spinner 的所有值并将它们推送到 SQLiteDatabase。 我的问题是,buttonSubmit 不在 ListView 的 class CustomAdapter 中,它位于拥有 ListView 的 MainActivity 中。 因此,当用户单击 按钮提交 这是我的代码: * ListView的自定义适配器代码class,每行有一个Spinner :
public class ChonLopTheoMonAdapter extends ArrayAdapter<MonHocDTO> implements AdapterView.OnItemSelectedListener{
Context context;
int layout;
ArrayList<MonHocDTO> listMonHoc;
ArrayAdapter<String> adapterSpinner;
String[] listLop;
public ChonLopTheoMonAdapter(Context context, int layout, ArrayList<MonHocDTO> listMonHoc) {
super(context, layout, listMonHoc);
this.context = context;
this.layout = layout;
this.listMonHoc = listMonHoc;
}
public class ViewHolder {
TextView txtTenMonHoc_ChonMon;
Spinner spChonLop;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(this.layout, parent, false);
holder = new ViewHolder();
holder.txtTenMonHoc_ChonMon = (TextView) convertView.findViewById(R.id.txtTenMonHoc_ChonMon);
holder.spChonLop = (Spinner) convertView.findViewById(R.id.spChonLop);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
holder.txtTenMonHoc_ChonMon.setText(this.listMonHoc.get(position).getTenMonHoc());
switch (this.listMonHoc.get(position).getIdMonHoc()){
case "QTM":
listLop = this.context.getResources().getStringArray(R.array.QTM);
break;
case "CTDL":
listLop = this.context.getResources().getStringArray(R.array.CTDL);
break;
case "TCC":
listLop = this.context.getResources().getStringArray(R.array.TCC);
break;
}
adapterSpinner = new ArrayAdapter<String>(this.context,android.R.layout.simple_spinner_item,listLop);
adapterSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
holder.spChonLop.setAdapter(adapterSpinner);
holder.spChonLop.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
return convertView;
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
*拥有listView的MainActivity代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
ListView lvChonLopTheoMonHoc;
Button btnXacNhanChonLop;
MonHocDAO monHocDAO;
ArrayList<MonHocDTO> listMonHoc;
ChonLopTheoMonAdapter chonLopTheoMonAdapter;
TypedArray thuTuMonHoc;
String[] tenMonHoc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addControls();
}
private void addControls() {
monHocDAO = new MonHocDAO(MainActivity.this);
lvChonLopTheoMonHoc = (ListView) findViewById(R.id.lvChonLopTheoMonHoc);
btnXacNhanChonLop = (Button) findViewById(R.id.btnXacNhanChonLop);
listMonHoc = new ArrayList<>();
listMonHoc = monHocDAO.layListMonHoc("NAM11");
chonLopTheoMonAdapter = new ChonLopTheoMonAdapter(MainActivity.this, R.layout.layout_chon_mon_hoc_theo_lop, listMonHoc);
chonLopTheoMonAdapter.notifyDataSetChanged();
lvChonLopTheoMonHoc.setAdapter(chonLopTheoMonAdapter);
btnXacNhanChonLop.setOnClickListener(MainActivity.this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnXacNhanChonLop:
break;
}
}
}
请帮助我:(
*这是 UI: enter image description here
你的架构有点破。您不会将数据保存在任何地方,因此实际上无法全部检索。您的数据模型需要反映在 ListView
中显示的数据,并且当用户更改数据(通过在 Spinner
中选择某些内容)时,您需要对 onItemSelected()
回调做出反应通过使用用户选择的项目更新您的数据模型。假设 Activity
将对数据的引用传递给您的适配器,Activity
可以一直访问更新的数据。
onItemSelected() 使用这个
spinner.getSelectedItem().toString();
获取所选项目。为了能够使用 MainActvity 中的值尝试使用 SharedPreferences 来保存所选项目的值。