如何从自定义ArrayList获取特定条目?

时间:2016-12-27 23:21:35

标签: java android json arraylist retrofit

我有一个使用Retrofit来使用API​​的Android应用,将JSON放入自定义ArrayList,然后使用自定义ListView填充ArrayAdapter。这可以按预期工作。

ListView项显示我使用的模型中可用的7个值中的3个。现在我想这样做,以便在单击列表项时,新活动开始并显示一个包含所有7个值的完整条目。

我使用onItemClickListener点击了列表项,并使Intent启动了新的活动。此活动有几个TextView,用于容纳单个条目中的所有7个值。我将JSON ArrayList设为parcelable,并将其作为Extra与Intent一起传递。

问题:

我可以填充ListViewRecyclerView,但我不知道如何提取特定索引下的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());

1 个答案:

答案 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)