2017-02-16 66 views
0

我的微調包含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的兩個職位,但他們沒有答案呢。

這樣做的正確方法是什麼?

+0

你是否檢查了從微調器中選擇的索引?它與你的json數組索引匹配嗎? – Piyush

+0

我也想這樣做,但我很困惑如何做到這一點,以獲得正確的數據在該位置 – neeta

+0

一個解決方案是你可以準備從你的JSON數組字符串列表作爲價值標準,稍後在微調你可以通過使用list.indexOf(選擇的標準)獲得選定標準的索引,並通過使用索引,你可以從你的json數組獲得json對象 – Piyush

回答

1

所以你想從選定的標準獲得所有學生的詳細信息。這裏是解決你的問題的代碼。

創建的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

0

它的因爲在你的微調項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

相關問題