忍者ブログ
アンドロイド アプリ  ランキング HOME > > [PR] > android > 【解決】android ListViewのonTouchにてNullPointerException RSS   Admin NewEntry Comment
プログラミング、Linux、Androidについて、検索しても出てこなかったことについて、自分用メモをつける。
  • 2017.02≪
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • ≫ 2017.04
アンドロイド アプリ  ランキング
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

クラッシュエラー通知でNullPointerExceptionが届いたが、
実装していないとこで発生している?のだろうか。


 
java.lang.NullPointerException
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
at android.widget.AbsListView.obtainView(AbsListView.java:1294)
at android.widget.ListView.makeAndAddView(ListView.java:1727)
at android.widget.ListView.fillDown(ListView.java:652)
at android.widget.ListView.fillGap(ListView.java:623)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:2944)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2065)
at android.widget.ListView.onTouchEvent(ListView.java:3315)
at android.view.View.dispatchTouchEvent(View.java:3765)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:905)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
at android.app.Activity.dispatchTouchEvent(Activity.java:2093)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4914)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

調べてみると、海外でよく同じ現象が起きているみたい。
動的にListViewを入れ替えているので、Listが空になった瞬間に動作が不安定になっているのか?


解決方法:

ArrayAdapterを実装する。

  解決方法:

ArrayAdapterを継承し、 getView(int, View, ViewGroup)をオーバーライドしする。

APIを見ると、「 getView(int, View, ViewGroup)をオーバーライドして、TextViewでもImageViewでも好きなView作って返すように実装しなさい」と書いている。(多分)

getViewをデバッグしてみるとListViewは、画面表示分の要素だけViewを生成していて、スクロールする度に、見えなくなる要素のViewを廃棄し、新たに表示される要素のViewを生成?していることがわかった。

ArrayAdaptorのgetViewでは対応し切れない場合、NullPointerExceptionが発生していたと想定できる。

<<ArrayAdapter<String>を使っている場合の例>>


private MyArrayAdapter adapter;
private ArrayList<String> list = new ArrayList<String>();

class MyArrayAdapter extends ArrayAdapter<String> {

       private int resource;

public  MyArrayAdapter(Context context, int resource, List<String> objects) {
super(context, resource, objects);
                this.resource = resource;
}

        /**
          * ListViewに新要素を追加するときにViewクラスのインスタンスを取得するためのメソッド
          * <pre>
          * なぜ、APIにこのメソッドの説明がないんだ?
          * 動作が快適かは置いといて、ヌルポンにはならないのでよしとする。
          * </pre>
          * @param position - 追加される要素のインデックス番号
          * @param convertView - 一個前の要素のViewインスタンス(position==0の場合、null)
          * @param parent - ListViewクラスのインスタンス
          * @see android.widget.ArrayAdapter#getView(int, android.view.View,
          * android.view.ViewGroup)
          */
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
               TextView v = null;
if (convertView != null && convertView instanceof TextView) {
v = (TextView) convertView;
} else {
v = (TextView) TextView.inflate(getContext(), this.resource, null);
}
              v.setText(this.getItem(position));
             return v;
         }  
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
ListView listView = (ListView) findViewById(R.id.MyListView);
                adapter = new MyArrayAdapter(this, android.R.layout.simple_list_item_1, list);

                listview.setListAdapter(adapter);
                
                list.add("aaaaa");
                list.add("bbbbb");
                adapter.notifyDataSetChanged();
            
            :
PR
postこの記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
[14]  [11]  [10]  [9]  [8]  [7]  [6]  [5]  [4]  [2
カレンダー
02 2017/03 04
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新CM
最新TB
プロフィール
HN:
kstv2011
性別:
男性
職業:
プログラマ
趣味:
作ること
自己紹介:
プログラマー、Javaを中心にネットワーク通信系アプリを作成する男。
バーコード
ブログ内検索
アクセス解析
技なれど波高し Produced by kstv2011
日めくりカレンダーBLUE Designed by がりんぺいろ
忍者ブログ [PR]