java.lang.ClassCastException: java.lang.Integer 无法转换为 java.util.HashMap

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.HashMap

我浏览了很多与我的问题非常相似的问题,并尝试了其他问题推荐的所有修复方法,但都无济于事。所以我决定 post 我自己的问题,希望有人能提供帮助。

新闻活动:

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class NewsActivity extends Activity {
private String xmlData;
private ListView listView;
private ArrayList<News> allNews;
private Image newsImage;

public final static String ITEM_TITLE = "newsTitle";
public final static String ITEM_DATE = "newsDate";
public final static String ITEM_DESCRIPTION = "newsDescription";
public final static String ITEM_IMGURL = "newsImageURL";

public Map<String, ?> createItem(String title, String date, String url) {
    Map<String,String> item = new HashMap<>();
    item.put(ITEM_TITLE, title);
    item.put(ITEM_DATE, date);
    item.put(ITEM_IMGURL, url);
    return item;
}

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar bar = getActionBar();
    bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#f8f8f8")));
    bar.setDisplayShowHomeEnabled(false);
    bar.setDisplayShowTitleEnabled(true);
    bar.setDisplayUseLogoEnabled(false);
    bar.setTitle("News");

    setContentView(R.layout.news_layout);

    Bundle newsBundle = getIntent().getExtras();
    xmlData = newsBundle.getString("xmlData");

    final ArrayList<News> newsData = getNewsData(xmlData);

    allNews = new ArrayList<News>();
    List<Map<String, ?>> data = new LinkedList<Map<String, ?>>();

    for(int i = 0; i < newsData.size(); i++) {
        News currentNews = newsData.get(i);
        String newsTitle = currentNews.getNewsTitle();
        String newsDate = currentNews.getNewsDate();
        String newsDescription = currentNews.getNewsDescription();
        String newsImageURL = currentNews.getNewsImageUrl();


        data.add(createItem(newsTitle, newsDate, newsImageURL));
        allNews.add(currentNews);
    }
    listView = (ListView) findViewById(R.id.news_list);
    LazyNewsAdapter adapter = new LazyNewsAdapter(this, newsData);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Map<String, String> item = (HashMap<String, String>) parent.getItemAtPosition(position); //**ERROR IS HERE: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.HashMap** //
            String title = item.get(ITEM_TITLE);
            String url = item.get(ITEM_IMGURL);
            String date = item.get(ITEM_DATE);

            Iterator<News> itp = allNews.iterator();
            News currentNews = null;

            while (itp.hasNext()) {
                currentNews = itp.next();
                if (title == currentNews.getNewsTitle() && url == currentNews.getNewsImageUrl() && date == currentNews.getNewsDate())
                    break;
            }

            String newsTitle = currentNews.getNewsTitle();
            String newsDescription = currentNews.getNewsDescription();
            String newsUrl = currentNews.getNewsImageUrl();
            String newsDate = currentNews.getNewsDate();

            Intent detailnewsScreen = new Intent(getApplicationContext(), DetailNewsActivity.class);
            detailnewsScreen.putExtra("newsTitle", newsTitle);
            detailnewsScreen.putExtra("newsDescription", newsDescription);
            detailnewsScreen.putExtra("url", newsUrl);
            detailnewsScreen.putExtra("newsDate", newsDate);

            startActivity(detailnewsScreen);
        }
    });
}

private ArrayList<News> getNewsData(String src) {
    ArrayList<News> newsList = new ArrayList<>();

    News currentNews = new News();
    String newsTitle = new String();
    String newsDate = new String();
    String newsUrl = new String();
    String newsDescription = new String();

    try {
        StringReader sr = new StringReader(src);
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(sr);

        int eventType = xpp.getEventType();

        while (eventType != XmlPullParser.END_DOCUMENT) {
            String name = null;
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    name = xpp.getName();
                    if (name.equals("news")) {
                        currentNews = new News();
                    }
                    else if (name.equals("ntitle")) {
                        newsTitle = xpp.nextText();
                        newsTitle = newsTitle.trim();
                    }

                    else if (name.equals("ndate")) {
                        newsDate = xpp.nextText();
                        newsDate = newsDate.trim();
                    }

                    else if (name.equals("nimage")) {
                        newsUrl = xpp.nextText();
                        newsUrl = newsUrl.trim();
                    }

                    else if (name.equals("ndescription")) {
                        newsDescription = xpp.nextText();
                        newsDescription = newsDescription.trim();
                    }

                    break;

                case XmlPullParser.END_TAG:
                    name = xpp.getName();

                    if (name.equals("news")) {
                        currentNews.setNewsTitle(newsTitle);
                        currentNews.setNewsDate(newsDate);
                        currentNews.setNewsImageUrl("http://www.branko-cirovic.appspot.com/iWeek/news/images/" + newsUrl);
                        currentNews.setNewsDescription(newsDescription);

                        newsList.add(currentNews);
                    }

                    break;
            }

            eventType = xpp.next();
        }
    }

    catch (Exception e){
        e.printStackTrace();
    }
    return newsList;
}
}

LazyNewsAdapter:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class LazyNewsAdapter extends BaseAdapter {

private Activity activity;
private ArrayList<News> listData;
private LayoutInflater inflater = null;

public LazyNewsAdapter(Activity activity, ArrayList<News> listData) {
    this.activity = activity;
    this.listData = listData;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public int getCount() {
    return listData.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    News newsItem = listData.get(position);

    View view = convertView;
    if(convertView == null)
        view = inflater.inflate(R.layout.news_cell, null);

    TextView newsTitle = (TextView) view.findViewById(R.id.newsTitle);
    TextView newsDate = (TextView) view.findViewById(R.id.newsDate);
    ImageView image = (ImageView) view.findViewById(R.id.newsImage);

    newsTitle.setText(newsItem.getNewsTitle());
    newsDate.setText(newsItem.getNewsDate());
    String url = newsItem.getNewsImageUrl();

    ImageLoader imageLoader = new ImageLoader(activity, 600, R.mipmap.placeholder);
    imageLoader.displayImage(url, image);

    return view;
}
}

我遇到的错误在 NewsActivity 中的旁边有一条评论。出于某种原因,它似乎试图将整数转换为 HashMap。我有多个其他 类 使用这个确切的方法并且没有问题,但是对于这个 NewsActivity 我收到这个错误。

有什么建议吗?

非常感谢!

你的 getItem 版本是 returning 一个 int

public Object getItem(int position) {
    return position;
}

这就是为什么你不能转换为 parent.getItemAtPosition(position);Map<String, String> 的原因。其次,您的 Adapter 的子类知道 News 类型的对象。你 getItem 应该 return 位置

News
public Object getItem(int position) {
    return listData.get(position);
}

并且您应该将 parent.getItemAtPosition(position); 的 returned 值转换为 News。变化

 Map<String, String> item = (HashMap<String, String>) parent.getItemAtPosition(position); 

 News item = (News) parent.getItemAtPosition(position); 

然后使用item访问其内容

我的猜测是 position 传递给 NewsActivity.onItemClick() 是错误的。 parent.getItemAtPosition() returns 行是您正在投射的对象,但如果位置错误,您将得到错误的对象,可能具有无法投射到哈希图的不同类型,因此会出现错误。