在选择Spinner中的项目后,在textview中显示相应的json数据
我的微调包含json的唯一标准值(例如:我的微调只包含7,8,6(我希望)而不是显示所有标准的转录数据),如果选择了微调项目,则它获取关于在该选择的标准中学习的那些学生的相应的所有信息。这里是我的代码,在选择Spinner中的项目后,在textview中显示相应的json数据
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ArrayList<String> AllStandards = new ArrayList<>();
ArrayAdapter<String> adapter;
JSONArray jsonArray;
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final List<String> items = getCountries("data.json");
spinner = (Spinner) findViewById(R.id.spinnerStandard);
adapter = new ArrayAdapter<String>(this, R.layout.second_layout, R.id.txtStandard, items);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
try {
Intent intent = new Intent(getApplicationContext(), StudentsInfo.class);
intent.putExtra("name", jsonArray.optJSONObject(i).getString("name"));
intent.putExtra("surname", jsonArray.optJSONObject(i).getString("surname"));
intent.putExtra("age", jsonArray.optJSONObject(i).getString("age"));
intent.putExtra("div", jsonArray.optJSONObject(i).getString("div"));
startActivity(intent);
} catch (JSONException e) {
e.printStackTrace();
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
spinner.setAdapter(adapter);
}//onCreate Method
private List<String> getCountries(String fileName) {
jsonArray = null;
//ArrayList<String> cList = new ArrayList<String>();
try {
InputStream is = getResources().getAssets().open(fileName);
int size = is.available();
byte[] data = new byte[size];
is.read(data);
is.close();
String json = new String(data, "UTF-8");
AllStandards.clear();
try {
jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String stand = jsonObject.getString("standard");
if (!AllStandards.contains(stand)) {
AllStandards.add(stand);
}
}
}
catch (JSONException je) {
je.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}catch (IOException e) {
e.printStackTrace();
}
return AllStandards;
}
}
这里是JSON数据,
[
{
"name":"aaa",
"surname":"bbb",
"age":"18",
"div":"A",
"standard":"7"
},
{
"name":"ccc",
"surname":"ddd",
"age":"17",
"div":"B",
"standard":"7"
},
{
"name":"eee",
"surname":"fff",
"age":"18",
"div":"A",
"standard":"8"
},
{
"name":"ggg",
"surname":"hhh",
"age":"17",
"div":"A",
"standard":"7"
},
{
"name":"sss",
"surname":"ddd",
"age":"18",
"div":"A",
"standard":"8"
},
{
"name":"www",
"surname":"ggg",
"age":"17",
"div":"A",
"standard":"7"
},
{
"name":"ggg",
"surname":"ccc",
"age":"18",
"div":"B",
"standard":"6"
}
但问题是,当我从我的微调选择标准7它显示只有一个学生的信息。但是我希望所有学生的信息都在7标准中学习。这应该发生在微调的所有choiecs(就像我的意思是如果我选择标准8,那么它应该显示所有学生的信息谁都在学习8标准,同样的标准6)
exapmle如果我选择标准7从微调,它应显示学生aaa,学生ccc,学生ggg,学生www的所有信息,因为他们都在标准7学习。
我试着用谷歌搜索找出解决这个问题,但我没有找到任何适合我的问题的答案。我检查了stackoverflow的两个职位,但他们没有答案呢。
这样做的正确方法是什么?
所以你想从选定的标准获得所有学生的详细信息。这里是解决你的问题的代码。
创建的getter的价值boject类和setter的从微调
public class StudentVO implements Serializable{
private String name;
private String surname;
private String age;
private String div;
private String standard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getDiv() {
return div;
}
public void setDiv(String div) {
this.div = div;
}
public String getStandard() {
return standard;
}
public void setStandard(String standard) {
this.standard = standard;
}
}
在主类
现在你在哪里选择标准替换为您的代码:
//Add this
public class MainActivity extends AppCompatActivity {
ArrayList<String> AllStandards = new ArrayList<>();
private ArrayList<StudentVO> studentVOList = new ArrayList<>();
ArrayAdapter<String> adapter;
JSONArray jsonArray;
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final List<String> items = getCountries("data.json");
spinner = (Spinner) findViewById(R.id.spinnerStandard);
adapter = new ArrayAdapter<String>(this, R.layout.second_layout, R.id.txtStandard, items);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
try {
String standard = AllStandards.get(i);
if (studentVOList.size() > 0)
studentVOList.clear();
for (int j = 0; j < jsonArray.length(); j++) {
JSONObject jsonObject = jsonArray.getJSONObject(j);
String stand = jsonObject.getString("standard");
if (stand.equalsIgnoreCase(standard)) {
StudentVO studentVO = new StudentVO();
studentVO.setAge(jsonObject.getString("age"));
studentVO.setName(jsonObject.getString("name"));
studentVO.setDiv(jsonObject.getString("div"));
studentVO.setStandard(stand);
studentVOList.add(studentVO);
}
}
Log.d("TAG", "List With All Students in selected standard: "+studentVOList.size());
Intent intent = new Intent(getApplicationContext(), StudentsInfo.class);
Bundle b = new Bundle();
b.putSerializable("list",studentVOList);
intent.putExtra("bundle",b);
startActivity(intent);
} catch (JSONException e) {
e.printStackTrace();
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
spinner.setAdapter(adapter);
}//onCreate Method
private List<String> getCountries(String fileName) {
jsonArray = null;
//ArrayList<String> cList = new ArrayList<String>();
try {
InputStream is = getResources().getAssets().open(fileName);
int size = is.available();
byte[] data = new byte[size];
is.read(data);
is.close();
String json = new String(data, "UTF-8");
AllStandards.clear();
try {
jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String stand = jsonObject.getString("standard");
if (!AllStandards.contains(stand)) {
AllStandards.add(stand);
}
}
}
catch (JSONException je) {
je.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}catch (IOException e) {
e.printStackTrace();
}
return AllStandards;
}
}
在这之后,你可以得到这个名单在StudentsInfo类中:
Bundle b = getIntent().getBundleExtra("bundle");
ArrayList<StudentVO> studentVOList = (ArrayList<StudentVO>) b.getSerializable("list");
Log.d("TAG", "List Size; "+studentVOList.size());
而且您不需要获取列表o f标准来自json数组。你可以准备标准1,2,3的学生的静态列表....等等,并将其传递给你的阵列适配器。
我只是检查你的代码 从MainActivity和的onCreate()StudentInfo活动类的方法,你可以删除
intent.putExtra("name", jsonArray.optJSONObject(i).getString("name"));
intent.putExtra("surname", jsonArray.optJSONObject(i).getString("surname"));
intent.putExtra("age", jsonArray.optJSONObject(i).getString("age"));
intent.putExtra("div", jsonArray.optJSONObject(i).getString("div"));
代码学生名单如:
Bundle b = getIntent().getBundleExtra("bundle");
ArrayList<StudentVO> studentVOList = (ArrayList<StudentVO>) b.getSerializable("list");
它的因为在你的微调项itemSelected监听器你越来越jsonArray.optJSONObject(i)在这里我是微调项的位置而不是标准。 你会从微调
spinner.getItemAtPosition(i);
得到这个标准是这样的价值,并与JSONArray所有元素的标准相匹配,并在列表中添加它。 然后通过你的意图列表。
intent.putStringArrayListExtra("test", (ArrayList<String>) test);
你是否检查了从微调器中选择的索引?它与你的json数组索引匹配吗? – Piyush
我也想这样做,但我很困惑如何做到这一点,以获得正确的数据在该位置 – neeta
一个解决方案是你可以准备从你的JSON数组字符串列表作为价值标准,稍后在微调你可以通过使用list.indexOf(选择的标准)获得选定标准的索引,并通过使用索引,你可以从你的json数组获得json对象 – Piyush