繁体   English   中英

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

[英]How to get a specific entry from a custom ArrayList?

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

ListView项目显示了我使用的模型中7个可用值中的3个。 现在,我想进行设置,以便在单击列表项时启动一个新活动,并显示一个包含所有7个值的完整条目。

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

问题:

我可以填充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());

首先-ListModel不是自定义的ArrayList ,它只是可打包的Object ,这就是为什么您不能使用ArrayList.get(int)

现在回到解决方案。 您有一些带有onClickListener的ListView,如下所示:

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);
    }
});

如果您有任何疑问或您的代码与此代码不同,请随时问我。

编辑

我不确定Retrofit是否迭代该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,而是List(或其他。如果需要改装,则可能是ListModels)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM