在选择Spinner中的项目后,在textview中显示相应的json数据

在选择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学习。

我试着用谷歌搜索找出解决这个问题,但我没有找到任何适合我的问题的答案。我检查了*的两个职位,但他们没有答案呢。

这样做的正确方法是什么?

+0

你是否检查了从微调器中选择的索引?它与你的json数组索引匹配吗? – Piyush

+0

我也想这样做,但我很困惑如何做到这一点,以获得正确的数据在该位置 – neeta

+0

一个解决方案是你可以准备从你的JSON数组字符串列表作为价值标准,稍后在微调你可以通过使用list.indexOf(选择的标准)获得选定标准的索引,并通过使用索引,你可以从你的json数组获得json对象 – Piyush

所以你想从选定的标准获得所有学生的详细信息。这里是解决你的问题的代码。

创建的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的学生的静态列表....等等,并将其传递给你的阵列适配器。

见我的调试结果: enter image description here

我只是检查你的代码 从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"); 
+0

你可以尝试这个@niya – Piyush

+0

应用程序崩溃后,我试着像你说的一样。我现在做什么?我真的不理解..我必须从JSON中获取标准仅限于我的任务 – neeta

+0

发布日志猫错误 – Piyush

它的因为在你的微调项itemSelected监听器你越来越jsonArray.optJSONObject(i)在这里我是微调项的位置而不是标准。 你会从微调

spinner.getItemAtPosition(i); 

得到这个标准是这样的价值,并与JSONArray所有元素的标准相匹配,并在列表中添加它。 然后通过你的意图列表。

intent.putStringArrayListExtra("test", (ArrayList<String>) test); 
+0

我不明白你的观点。请用一些例子再解释一遍。如果其可能的 – neeta

+0

看到,当您从微调器中选择'8'时,微调器项目中8的位置为'1'。 现在,当你得到jsonArray.optJSONobject(1)时,你会得到你想传递的“名字” “ccc”和“standard”“7”。 –

+0

是的,它应该根据我的微调选择值而改变 – neeta