我有一個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());
如果我明白你的問題..你試圖實現的是打開一個新的活動,並顯示整個響應你是從改造?對?你爲什麼需要這個json?我的意思是Retrofit爲你映射響應,所以你可以簡單地分享整個對象而不是json。如果我錯過了某些東西,請張貼您的列表適配器。 – kristyna
讓我再說一遍:我只想擴展一個特定的條目。假設用戶點擊一個列表項,其中包含「ID:1,Young,Loen」。它開始一個新的活動,用一些TextView來表示「ID:1,Young,692-(371)616-8685,96333(...)」等。如果我只是將整個改造響應堵塞在那裏,那麼wouldn那是不是意味着來自該JSON的所有其他人也包括在內?我不確定是否Retrofit會遍歷該JSON併爲每個人創建一個單獨的ArrayList對象,或者只是將所有對象都打包到一個ArrayList中?如果有幫助,我正在使用適配器更新問題。 –
請看看編輯過的答案,希望看完後能更清楚:) – kristyna