android - 将 SeparatedListAdapter 用于 ListView 在 Android 2.1 上崩溃但适用于 2.2

标签 android listview android-2.2-froyo listadapter simpleadapter

我正在使用由 Jeff Sharkey 编写的 SeparatedListAdapter .我最初是在 Nexus One 上开始开发这个应用程序的,我已经让它完全按照预期工作。现在我继续测试某些部分,我的应用程序在所有其他运行 Android 2.1 的手机上崩溃。我的项目 Build Target 是 2.1-update1,与所有这些手机相同。

这是错误的 LogCat

01-21 18:24:01.486: ERROR/AndroidRuntime(4615): Uncaught handler: thread main exiting due to uncaught exception
01-21 18:24:01.588: ERROR/AndroidRuntime(4615): java.lang.NullPointerException
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:171)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:138)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.SimpleAdapter.getView(SimpleAdapter.java:116)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at com.hitpost.GamesList$SeparatedListAdapter.getView(GamesList.java:347)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.AbsListView.obtainView(AbsListView.java:1274)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.ListView.makeAndAddView(ListView.java:1668)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.ListView.fillDown(ListView.java:637)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.ListView.fillSpecific(ListView.java:1224)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.ListView.layoutChildren(ListView.java:1511)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.view.View.layout(View.java:6830)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:900)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.view.View.layout(View.java:6830)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.view.View.layout(View.java:6830)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.view.View.layout(View.java:6830)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at android.os.Looper.loop(Looper.java:123)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at  android.app.ActivityThread.main(ActivityThread.java:4363)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at java.lang.reflect.Method.invokeNative(Native Method)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at java.lang.reflect.Method.invoke(Method.java:521)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-21 18:24:01.588: ERROR/AndroidRuntime(4615):     at dalvik.system.NativeStart.main(Native Method)

我的代码中被 logcat 引用的相关部分

     @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        int sectionnum = 0;  
        for(Object section : this.sections.keySet()) {  
            Adapter adapter = sections.get(section);  
            int size = adapter.getCount() + 1;  
  
            
            // check if position inside this section  
            if(position == 0) 
                return headers.getView(sectionnum, convertView, parent);  
            if(position < size) {
                //View row = convertView;
                ScoreViewHolder viewHolder;
                HashMap<String,Object> map = (HashMap<String,Object>) adapter.getItem(position - 1);
                if (convertView == null) {
                    convertView = inflater.inflate(R.layout.league_list_item, null);
                    viewHolder = new ScoreViewHolder();
                    viewHolder.row = (RelativeLayout) convertView.findViewById(R.id.ListItem);
                    viewHolder.checkinImage = (ImageView) viewHolder.row.findViewById(R.id.CheckinLeagueImage);
                    viewHolder.score1 = (TextView) viewHolder.row.findViewById(R.id.Team1Score);
                    viewHolder.score2 = (TextView) viewHolder.row.findViewById(R.id.Team2Score);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ScoreViewHolder) convertView.getTag();
                }
                if ((Integer) map.get("position") % 2 == 1)
                    viewHolder.row.setBackgroundColor(Color.DKGRAY);
                else
                    viewHolder.row.setBackgroundColor(Color.GRAY);
                
                if (map.get("gamestatus").equals("Final")) {
                    viewHolder.gameFinal();
                } else if (map.get("gamestatus").equals("In-Progress")) {
                    viewHolder.gameInProgress();
                } else if (map.get("gamestatus").equals("Pre-Game")) {
                    viewHolder.gameFinal();
                }
                viewHolder.row.setOnClickListener(new GameItemListener((String)map.get("id"), 
                        map.get("team2Name") + " " +
                        map.get("team2Score") + " @ " +
                        map.get("team1Name") + " " +
                        map.get("team1Score")                               
                ));
                return adapter.getView(position - 1, convertView, parent);                      
            }
            
            // otherwise jump into next section  
            position -= size;  
            sectionnum++;  
        }  
        return null;  
    }

错误出现在“return adapter.getView(position - 1, convertView, parent);”

在 StackOverflow 上花了很多钱,我知道很难理解发生了什么,这里是一个总结。 ListView 显示运动的比分列表,因此每个项目都包含 2 个球队名称、2 个比分和一个图标。

将不胜感激任何提示。我已经尝试查看 SimpleAdapter 的代码以找出导致错误的原因,但无法弄清楚。谢谢。

最佳答案

我已经解决了这个问题,并且正在回应可能对其他 Android 开发者有帮助的问题。

问题是我试图让 SeparatedListAdapter getView 执行底层适配器应该处理的事情。我将我的适配器称为 SectionAdapter,它扩展了 SimpleAdapter,我可以根据需要在其中操作我的 View 元素。当我添加这样的部分时

adapter.addSection(currentGameDate, new SectionAdapter(mContext, mActivity, currentGameDateSubset, R.layout.league_list_item, keyNames, keyIds));

希望对您有所帮助。

关于android - 将 SeparatedListAdapter 用于 ListView 在 Android 2.1 上崩溃但适用于 2.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765831/

相关文章:

android - 无法从 RecyclerView.OnScrollListener 调用 notifyItemInserted()

java - 自定义 ListView 未填充

java - 我的自定义适配器未在 fragment 中显示

C# ListView : ListViewItem offset possible?

Android SDK 安装失败

android - 如何关闭整个任务堆栈的 Activity ?

java - 如果单词对于 TextView 来说太长,则强制下一个单词换行

android - ExpandableListView 可以嵌入到另一个布局中吗?

android - 如何异步调用rest api并等待所有调用在rx-android中完成

android - 从 Android 1.6 到 Android 2.2 的升级和应用程序不起作用