我有一个使用Retrofit
来使用API的Android应用,将JSON放入自定义ArrayList
,然后使用自定义ListView
填充ArrayAdapter
。这可以按预期工作。
ListView
项显示我使用的模型中可用的7个值中的3个。现在我想这样做,以便在单击列表项时,新活动开始并显示一个包含所有7个值的完整条目。
我使用onItemClickListener
点击了列表项,并使Intent
启动了新的活动。此活动有几个TextView
,用于容纳单个条目中的所有7个值。我将JSON ArrayList
设为parcelable,并将其作为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 :(得分:2)
首先 - ListModel不是自定义System.Collections.Generic.Dictionary{System.Object,System.String}
,它只是可以ArrayList
,这就是为什么你不能使用Object
。
现在回到解决方案。 你有一些带有onClickListener的ListView,它可能如下所示:
ArrayList.get(int)
如果您有一些收藏品,请说listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// HANDLE CLICK
}
});
,List<ListModel>
参数就是您需要的参数。 onClickLister应为:
position
如果您有任何问题或者您的代码与此不同,请随时问我。
修改强>
我不确定Retrofit是否会迭代该JSON并为每个人创建一个单独的ArrayList对象
如果您已从您发布的代码中成功创建了ListView,那么一个ListModel ==一个人。这就是Retrofit的魔力! 猜猜你的json层次结构就像这样:
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);
}
});
然后,retrofit将获取每个JSONObject并将其转换为您的对象(ListModel)
如果我把整个改装响应塞进那里,那不就意味着JSON中的所有其他人也被包括在内吗?
通过执行
,您不会将整个改造响应传递给该活动[
{"id":1, "name":"somename1",...},
{"id":2, "name":"somename2",...},
{"id":3, "name":"somename3",...}
]
正如我所说,一个ListModel ==一个人。整个改装响应不是ListModel,而是List(或者其他......如果你需要改装那么可能是ListModels)