【问题标题】:Hashmap in RecycerView cannot be cast to ListRecyclerView 中的 Hashmap 无法转换为 List
【发布时间】:2014-10-30 05:03:13
【问题描述】:

我有一个列表,其中新闻类有标题、日期、url、图像 Url 和图像 alt。当我尝试访问数组位置中的特定新闻项时,它会抛出 java.util.HashMap cannot be cast to News

这里是回收器适配器 http://hastebin.com/ohuvopoqiv.avrasm

编辑: 这是完整的例外

10-29 22:18:24.587  28148-28148/io.github.brady131313.shsnewspaper E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: io.github.brady131313.shsnewspaper, PID: 28148
    java.lang.ClassCastException: java.util.HashMap cannot be cast to io.github.brady131313.shsnewspaper.News.NewsItem
        at io.github.brady131313.shsnewspaper.News.NewsAdapter.onBindViewHolder(NewsAdapter.java:53)
        at io.github.brady131313.shsnewspaper.News.NewsAdapter.onBindViewHolder(NewsAdapter.java:22)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:4048)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3366)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:522)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1918)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:2155)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:887)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1440)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1440)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:15745)
        at android.view.ViewGroup.layout(ViewGroup.java:4868)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2330)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2043)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6567)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
        at android.view.Choreographer.doCallbacks(Choreographer.java:603)
        at android.view.Choreographer.doFrame(Choreographer.java:573)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.

编辑: 我通过列表的类

public class NewsSelectorFragment extends Fragment {

  public static RecyclerView mRecyclerView;
  public static Firebase firebase = new Firebase("https://shs-newspaper.firebaseio.com/");
  public static List<NewsItem> mNews = new ArrayList<NewsItem>();

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.news_selector_fragment, container, false);
  }

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    MainActivity.toolbar.setTitle("Sherwood Arrow");

    mRecyclerView = (RecyclerView) getActivity().findViewById(R.id.news_recycler);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.getRecycledViewPool().clear();
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    firebase.child("News").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            mNews = (List<NewsItem>) dataSnapshot.getValue();
            /*for (int i = 0; i < mNews.size(); i++) {
                System.out.println(mNews.get(i));
            }*/

            mRecyclerView.setAdapter(new NewsAdapter(mNews));
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
  }
}

【问题讨论】:

标签: java android casting hashmap firebase


【解决方案1】:

您链接的代码(您确实应该在此处包含相关代码,而不仅仅是链接到它)以两种方式设置 mNews。将其设置为一个新的 ArrayList。另一个允许它像这样传递:

public NewsAdapter(List<NewsItem> news) {
    this.mNews = news;
}

为了得到你链接的错误(参见前面的唠叨),某人已经建立了一个地图并以某种方式投射它,让他们在 mNews 中偷偷把它给你。这会在您尝试将其用作列表时立即中断。找出它的来源。

【讨论】:

  • 最好在不发布第二个答案的情况下编辑您的第一个答案。
  • 我正在使用 firebase 检索数据,当我设置数据时,我通过执行 (List) 将其转换为,那么为什么将其设置为哈希图
  • 您必须向我展示提供给您的代码。但是该错误告诉您,您获得的是地图而不是列表。铸造不会解决这个问题,因为一个不会从另一个继承。
  • 当我打印出 List 中的所有值时,它们不会以 Hashmaps 的形式出现,它们没有键,它只是值
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多