【问题标题】:Getting HashMap associated with particular item in ListView获取与 ListView 中的特定项目关联的 HashMap
【发布时间】:2014-03-21 10:37:44
【问题描述】:

我有一个 ListView,我在其中显示从 JSON 格式的 URL 获取的 ArrayList 中的项目。每个项目由 5 个元素组成。当单击另一个活动时,我想将与该特定列表项关联的元素传递给它。但是,当我将ArrayList 传递给其他活动并迭代ArrayList 时,无论我单击哪个列表项,都只会打开列表中的最后一项。

这是我的代码:

MainActivity.java

JSONArray jObject = new JSONArray(responseBody);
for (int i = 0; i < jObject.length(); i++) {
  JSONObject menuObject = jObject.getJSONObject(i);
  String title= menuObject.getString("Title");
  String description= menuObject.getString("BodyText");
  String thumbnail= menuObject.getString("ThumbnailPath");
  String nUrl = menuObject.getString("Url");
  String body = menuObject.getString("Body");
  String nBigImage = menuObject.getString("ImageBlobUrls");

  map = new HashMap<String,String>();
  map.put(SOURCETITLE, title);
  map.put(TITLE, description);
  map.put(THUMBNAILPATH, thumbnail);
  map.put(BODY, body);
  map.put(URL, nUrl);
  map.put(IMAGEBLOBURLS,nBigImage);

  myList.add(map);
}

myListView.setAdapter(itemsAdapter);
myListView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
    {
        // TODO Auto-generated method stub
        Intent nIntent = new Intent(Home.this,NDetails.class);
        nIntent.putExtra("myItems", myList);
        startActivity(nIntent);
    }
});

NDetails.java

Intent in = getIntent();

    data =  (ArrayList<HashMap<String, String>>) in.getSerializableExtra("myItems");

    for(Map<String, String> newItem:data)
    {
         newUrl = newItem.get(Home.URL);
         newTitle =newItem.get(Home.SOURCETITLE);
         newBody= newItem.get(Home.BODY);
         newImage = newItem.get(Home.THUMBNAILPATH);

    }


     txtNewsTitle.setText(newTitle);
     txtNewsBody.setText(newBody);

我该如何解决这个问题? 谢谢

【问题讨论】:

    标签: java android listview arraylist


    【解决方案1】:

    试试这个:

    myListView.setOnItemClickListener(new OnItemClickListener() 
                            {
    
                                @Override
                                public void onItemClick(AdapterView<?> arg0,
                                        View arg1, int position, long arg3) 
                                {
                                    // TODO Auto-generated method stub
    
                                    HashMap myMap = myList.get(position);
                                    Intent nIntent = new Intent(Home.this,NDetails.class);
                                    newsIntent.putExtra("myItems", myMap);
                                    startActivity(nIntent);
                                }
                            });
    

    然后像这样在另一个活动中获取地图:

    data =  (HashMap<String, String>>) in.getSerializableExtra("myItems");
    
    newUrl = data.get(Home.URL);
         data =newItem.get(Home.SOURCETITLE);
         data= newItem.get(Home.BODY);
         data = newItem.get(Home.THUMBNAILPATH);
    

    【讨论】:

    • 我尝试了您的解决方案。但是在下一个活动中,当我尝试遍历地图时出现错误Can only iterate over an array or an instance of java.lang.Iterable
    • 但是在下一个活动中不要进行任何迭代,只需从意图中获取哈希图并从中获取数据。不需要任何数组列表,也不需要迭代该列表。
    【解决方案2】:
    myListView.setOnItemClickListener(new OnItemClickListener() {
    
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        HashMap<String, String> item = ( HashMap<String, String>)arg0.getItemAtPosition(position);
        Intent nIntent = new Intent(Home.this,NDetails.class);
        newsIntent.putExtra("myItems", myList);
        startActivity(nIntent);
    }
     });
    

    您可以使用AdapterView.getItemAtPosition(int) 检索位置的元素

    【讨论】:

    • 如何在下一个活动中获取特定位置的元素?
    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多