2016-12-27 56 views
1

我有一個Android應用程序使用Retrofit來使用API​​,將JSON放入自定義ArrayList中,然後使用自定義ArrayAdapter填充ListView。這按預期工作。如何從自定義ArrayList中獲取特定條目?

ListView項目顯示我使用的模型中可用的7個值中的3個。現在我想做到這一點,當點擊一個列表項時,一個新的活動開始並顯示一個完整的條目,包含所有7個值。

我讓列表項可點擊onItemClickListener,並創建了一個Intent開始新的活動。這個活動有幾個TextView,它們可以容納來自單個條目的所有7個值。我製作了JSON ArrayList,並將其作爲Extra加入Intent

問題:

我可以填充ListView的和RecyclerView的還好,但我不知道如何提取JSON數據特定的指標下的。 ArrayList.get(x)不起作用,因爲該對象是自定義的,並且不包含該方法,我認爲。這裏是我的ArrayList型號:

public class ListModel implements Parcelable { 

@SerializedName("id") 
private String idno; 

@SerializedName("name") 
private String name; 

@SerializedName("telno") 
private String telno; 

@SerializedName("street") 
private String street; 

@SerializedName("city") 
private String city; 

@SerializedName("hour") 
private String hour; 

@SerializedName("desc") 
private String desc; 


public ListModel(String idno, 
       String name, 
       String telno, 
       String street, 
       String city, 
       String hour, 
       String desc) { 
    this.setIdno(idno); 
    this.setName(name); 
    this.setTelno(telno); 
    this.setStreet(street); 
    this.setCity(city); 
    this.setHour(hour); 
    this.setDesc(desc); 
} 

public String getIdno() {return idno;} 
public void setIdno(String idno) {this.idno = idno;} 

public String getName() {return name;} 
public void setName(String name) {this.name = name;} 

public String getTelno() {return telno;} 
public void setTelno(String telno) {this.telno = telno;} 

public String getStreet() {return street;} 
public void setStreet(String street) {this.street = street;} 

public String getCity() {return city;} 
public void setCity(String city) {this.city = city;} 

public String getHour() {return hour;} 
public void setHour(String hour) {this.hour = hour;} 

public String getDesc() {return desc;} 
public void setDesc(String desc) {this.desc = desc;} 

// Parcel stuff after this 

而且,這裏的JSON的一個片段:

[{"id":1,"name":"Young","telno":"692-(371)616-8685","street":"96333 Anhalt Court","city":"Loen","hour":"18:38","desc":"Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;"}, 
{"id":2,"name":"Fowler","telno":"46-(368)133-6356","street":"5 School Parkway","city":"Onsala","hour":"16:17","desc":"Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius."}, 

這裏的適配器:

public class UsersAdapter extends ArrayAdapter<ListModel> { 


public UsersAdapter(Context context, ArrayList<ListModel> users) { 
    super(context, 0, users); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ListModel listModel = getItem(position); 

    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); 
    } 

    TextView hourTV = (TextView) convertView.findViewById(R.id.hourTV); 
    TextView idnoTV = (TextView) convertView.findViewById(R.id.idnoTV); 
    TextView nameTV = (TextView) convertView.findViewById(R.id.nameTV); 

    hourTV.setText(listModel.getHour()); 
    idnoTV.setText(listModel.getIdno()); 
    nameTV.setText(listModel.getName()); 

    return convertView; 

} 

}

請讓我知道如果任何需要更多的代碼。這是我的第一個應用程序,如果我錯過了一些明顯的東西,或者沒有足夠清楚地解釋我自己,請耐心等待。

謝謝。

解決方案編輯

這裏的工作結果:

MainActivity.java

public ArrayList<ListModel> dataSource = new ArrayList<>(); 

// Retrofit fetches and parses JSON here. 

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { 

      Intent detailViewIntent = new Intent(MainActivity.this, DetailView.class); 

      ListModel listModel = dataSource.get(position); 
      detailViewIntent.putExtra("TAG", listModel); 
      Bundle bundle = new Bundle(); 
      bundle.putParcelable("jsondata", listModel); 
      detailViewIntent.putExtras(bundle); 
      startActivity(detailViewIntent); 
     } 
    }); 
} 

DetailView.class

public class DetailView extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.detail_view); 

    Bundle bundle = getIntent().getExtras(); 
    ListModel jsondata = bundle.getParcelable("jsondata"); 

    // Populate 7 TextViews using ListModel getters like so: 
    TextView hourTV = (TextView) findViewById(R.id.hourTV); 
    hourTV.setText(jsondata.getHour()); 
+0

如果我明白你的問題..你試圖實現的是打開一個新的活動,並顯示整個響應你是從改造?對?你爲什麼需要這個json?我的意思是Retrofit爲你映射響應,所以你可以簡單地分享整個對象而不是json。如果我錯過了某些東西,請張貼您的列表適配器。 – kristyna

+0

讓我再說一遍:我只想擴展一個特定的條目。假設用戶點擊一個列表項,其中包含「ID:1,Young,Loen」。它開始一個新的活動,用一些TextView來表示「ID:1,Young,692-(371)616-8685,96333(...)」等。如果我只是將整個改造響應堵塞在那裏,那麼wouldn那是不是意味着來自該JSON的所有其他人也包括在內?我不確定是否Retrofit會遍歷該JSON併爲每個人創建一個單獨的ArrayList對象,或者只是將所有對象都打包到一個ArrayList中?如果有幫助,我正在使用適配器更新問題。 –

+0

請看看編輯過的答案,希望看完後能更清楚:) – kristyna

回答

2

首先 - ListModel的不一個自定義ArrayList,它只是可以編輯Object,這就是爲什麼你不能使用ArrayList.get(int)

現在回到解決方案。 你有一些的ListView與onClickListener,這可能是這樣的:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     // HANDLE CLICK 
    } 
}); 

如果你有一定的收藏,可以說List<ListModel>,在position參數是一個你需要的。onClickLister應該是:

private List<ListModel> listData; 
.... 
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Intent intent = new Intent(...); 
     // Get the object that has been clicked 
     ListModel listModel = listData.get(position); 
     // Pass it to your activity 
     i.putExtra("TAG", listModel); 
     startActivity(i); 
    } 
}); 

如果您有任何問題或者您的代碼與此不同,請隨時問我。

編輯

我不知道如果改造迭代是JSON,併爲每個人單獨ArrayList對象

如果您已成功創建從代碼一個ListView你發佈,比一個ListModel ==一個人。這就是改造的魔力! 猜猜你的JSON層次是像這樣的:

[ 
    {"id":1, "name":"somename1",...}, 
    {"id":2, "name":"somename2",...}, 
    {"id":3, "name":"somename3",...} 
] 

然後改造需要每一個的JSONObject並把它轉換成你的對象(ListModel的)

如果我只是被卡在那裏了整個改裝響應,止跌」這意味着來自該JSON的所有其他人也被包括在內嗎?

你不會做

ListModel listModel = listModels.get(position); 

正如我所說的,一個ListModel的==一人通過整體改造響應該活動。整個改造響應不是ListModel,但列表(或任何..也許ListModels,如果你需要從改造)

+0

謝謝你的回答,這很有啓發。我的代碼很相似,但我沒有選出所需的ListModel部分。當我有機會時,我會嘗試實施它,然後編輯原始問題以更清楚一些。 –

+0

它的工作原理!在過去的幾天裏,你已經把我從一個洞裏挖出來了,謝謝你!我編輯了問題以包含工作結果。我想標題需要改變,但我不知道如何正確命名它。 –

相關問題