リストアイテムが非常に重い、非常に重い ListView アプリに取り組んでいます。ユーザーがいくつかのリスト項目しか持っていない場合はすべて正常に機能しますが、ユーザーがさらに追加するといくつかの問題が表面化し始めます。リストアイテムとのやり取りが難しくなり、アイテムをクリックすると、ユーザーはタッチ効果を得るが効果がない場合があります。位置にアクセスすると (これはコンテキスト アクション バーhttp://developer.android.com/guide/topics/ui/menus.html#CABを使用するときに行われます)、クリックすると NullPointerException がスローされます。これは、GC がアプリのリソースを殺していたためだと確信しています。この種の動作を回避する方法、またはこれを修正するための何らかの回避策についての一般的なヒントはありますか?
ありがとう!
編集:
Logcat クラッシュ:
01-07 15:59:39.219: E/AndroidRuntime(8003): FATAL EXCEPTION: main
01-07 15:59:39.219: E/AndroidRuntime(8003): java.lang.NullPointerException
01-07 15:59:39.219: E/AndroidRuntime(8003): at com.simon.holocountownapp.MainActivity$1.onItemCheckedStateChanged(MainActivity.java:104)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.widget.AbsListView$MultiChoiceModeWrapper.onItemCheckedStateChanged(AbsListView.java:6037)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.widget.AbsListView.setItemChecked(AbsListView.java:1013)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.widget.AbsListView.performLongPress(AbsListView.java:2807)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2765)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.os.Handler.handleCallback(Handler.java:725)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.os.Handler.dispatchMessage(Handler.java:92)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.os.Looper.loop(Looper.java:137)
01-07 15:59:39.219: E/AndroidRuntime(8003): at android.app.ActivityThread.main(ActivityThread.java:5191)
01-07 15:59:39.219: E/AndroidRuntime(8003): at java.lang.reflect.Method.invokeNative(Native Method)
01-07 15:59:39.219: E/AndroidRuntime(8003): at java.lang.reflect.Method.invoke(Method.java:511)
01-07 15:59:39.219: E/AndroidRuntime(8003): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
01-07 15:59:39.219: E/AndroidRuntime(8003): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
01-07 15:59:39.219: E/AndroidRuntime(8003): at dalvik.system.NativeStart.main(Native Method)
104 行目 (logcat で参照) は listView.getChildAt(position) を呼び出します。これはおそらく null を返し、クラッシュにつながります。
レイアウトはかなり重い (200 行以上のコード) ので、pastebin に投稿します。 http://pastebin.se/KTmCA0jc
アダプター:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CountdownViewHolder holder;
CountdownItem ci = mTitle.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_layout, parent,
false);
holder = new CountdownViewHolder();
holder.mTitle = (TextView) convertView.findViewById(R.id.textPrim);
holder.mSubtitle = (TextView) convertView
.findViewById(R.id.textSec);
holder.mOverflow = (ImageButton) convertView
.findViewById(R.id.overflow);
holder.mInfo = (ImageButton) convertView.findViewById(R.id.info);
holder.expand_layout = (LinearLayout) convertView
.findViewById(R.id.expand_layout);
holder.mExpDay = (TextView) convertView.findViewById(R.id.exp_day);
holder.mExpSec = (TextView) convertView.findViewById(R.id.exp_sec);
holder.mDayProgress = (ProgressBar) convertView
.findViewById(R.id.day_progress);
holder.mMonthProgress = (ProgressBar) convertView
.findViewById(R.id.month_progress);
holder.mYearText = (TextView) convertView
.findViewById(R.id.year_text);
holder.day_help = (TextView) convertView
.findViewById(R.id.day_help);
holder.month_help = (TextView) convertView
.findViewById(R.id.month_help);
holder.setTag(position);
holder.setupInfoClickActions();
holder.setupOnClickListener();
holder.setTitle(ci.getTitle());
holder.setSubtitle(ci.getSubtitle());
holder.fixImageAndText(position);
convertView.setTag(holder);
} else {
holder = (CountdownViewHolder) convertView.getTag();
}
holder.manageExpand(ci.getExpand(), ctx, position, mTitle.size());
return convertView;
}