Verwenden von SeparatedListAdapter für ListView stürzt bei Android 2.1 ab, funktioniert jedoch mit 2.2
-
16-10-2019 - |
Frage
Ich verwende SeparatedListAdapter wie geschrieben von Jeff Sharkey . Ich habe ursprünglich angefangen, diese Anwendung auf Nexus One zu entwickeln, wo ich sie genauso wie beabsichtigt funktioniert. Jetzt teste ich bestimmte Teile und meine Anwendung stürzt auf all diesen anderen Telefonen, die Android 2.1 ausführen. Mein Projekt Build-Ziel ist 2.1-update1 wie alle diese Telefone.
Hier ist der Logcat für den Fehler
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)
Der relevante Teil meines Code
@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;
}
Mit dem Fehler "adapter zurückgeben.getView (Position - 1, convertView, übergeordnet)";
Nachdem ich eine angemessene Menge für Stackoverflow verbracht habe, weiß ich, dass es sehr schwer zu verstehen ist, was los ist. Hier ist eine Zusammenfassung. Die ListView zeigt eine Liste der Punktzahlen für Sport an, sodass jedes Element aus 2 Teamnamen, 2 Bewertungen und einem Symbol besteht.
Würde sich über Hinweise freuen. Ich habe versucht, durch den Code von Simpleadapter zu suchen, um herauszufinden, was den Fehler verursacht, aber nicht herausfinden kann. Vielen Dank.
Lösung
Ich habe das herausgefunden und reagiere darauf, anderen Android -Entwicklern möglicherweise zu helfen.
Das Problem ist, dass ich versucht habe, SeparatedListAdapter GetView zu machen, um Dinge zu tun, um die sich der zugrunde liegende Adapter kümmern soll. Ich rief meinen Adapter einen Abschnittsadapter an, der SimplEDapter erweitert, wo ich meine Sichtelemente so manipuliere, wie ich es braucht. Wenn ich einen solchen Abschnitt hinzufüge
adapter.addSection(currentGameDate, new SectionAdapter(mContext, mActivity, currentGameDateSubset, R.layout.league_list_item, keyNames, keyIds));
Ich hoffe, das hilft.