-1

私はSMSアプリを構築しており、ユーザーと彼の会話のパートナーとの間のSMSのリストを表示するアクティビティで、ListView着信および発信SMSを表す2つの異なるレイアウトを使用しようとしていました.

2つのレイアウトで作業しようとするまで、すべてがうまくいきました。必要に応じて、着信\発信の2つの異なるレイアウトでSMSのリストを正しく表示できます。しかし、リストをスクロールすると、NullPointerException が発生します。

これは私のアダプターです:

private class MyListAdapter extends ArrayAdapter<Sms> {
    public MyListAdapter() {
        super(ExistingConversation.this, R.layout.item_conversation_incoming, smsList);
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getCount() {
        return smsList.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // find the Sms to work with
        Sms currentSms = smsList.get(position);

        // Make sure we have a view to work with (may have been given null)
        View itemView = convertView;
        if (itemView == null) {
            if (currentSms.getIncomingOutgoing().equals("in")){// inflate the list for an incoming message
                itemView = getLayoutInflater().inflate(R.layout.item_conversation_incoming, parent, false);
            }
            else{ // inflate the list for an outgoing message
                itemView = getLayoutInflater().inflate(R.layout.item_conversation_outgoing, parent, false);
            }
        }

        // Fill the view:
        if (currentSms.getIncomingOutgoing().equals("in")){ //for incoming
            // Content:
            TextView contentView = (TextView) itemView.findViewById(R.id.item_content_incoming);
            contentView.setText(currentSms.getContent());

            // time:
            TextView timeView = (TextView) itemView.findViewById(R.id.item_time_incoming);
            timeView.setText(new Date(currentSms.getDate()).toString().substring(0, 19));
        }
        else{//for outgoing
            // Content:
            TextView contentView = (TextView) itemView.findViewById(R.id.item_content_outgoing);
            contentView.setText(currentSms.getContent());

            // time:
            TextView timeView = (TextView) itemView.findViewById(R.id.item_time_outgoing);
            timeView.setText(new Date(currentSms.getDate()).toString().substring(0, 19));

        }
        return itemView;
    }
}
}

これらは私の2つのレイアウトです:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingRight="16dp"
android:paddingTop="8dp" >

<LinearLayout
    android:id="@+id/item_container_incoming"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:background="@drawable/list_selector_incoming"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/item_icon_incoming"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:src="@drawable/social_person2" />

    <TextView
        android:id="@+id/item_content_incoming"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="16dp"
        android:layout_weight="4"
        android:text="Here Goes The Content" />

    <TextView
        android:id="@+id/item_time_incoming"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:layout_weight="1"
        android:text="Small Text"
        android:textSize="12sp" />
</LinearLayout>

発信 1 は、「着信」と書かれている場所を除いてすべて同じです (これは明らかに wrtien outgoingであり、RelativeLayoutパディングの属性にあります (右パディングの代わりに左パディングです...)

さらに、logCat スタック トレースをここに投稿します。これは、厄介な問題の解決策を見つけるのに役立つ場合があります。

08-11 20:18:38.707: E/AndroidRuntime(23441): FATAL EXCEPTION: main
08-11 20:18:38.707: E/AndroidRuntime(23441): java.lang.NullPointerException
08-11 20:18:38.707: E/AndroidRuntime(23441):    at com.example.smser.ExistingConversation$MyListAdapter.getView(ExistingConversation.java:356)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.AbsListView.obtainView(AbsListView.java:2452)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.ListView.makeAndAddView(ListView.java:1776)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.ListView.fillUp(ListView.java:712)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.ListView.fillGap(ListView.java:651)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5711)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3422)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.widget.AbsListView.onTouchEvent(AbsListView.java:4087)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.View.dispatchTouchEvent(View.java:7380)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2464)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2470)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2212)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2470)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2212)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2470)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2212)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2470)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2212)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow. java:2151)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1480)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.app.Activity.dispatchTouchEvent(Activity.java:2487)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2099)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.View.dispatchPointerEvent(View.java:7565)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3427)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3359)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4468)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4446)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4550)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:163)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4518)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4569)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.Choreographer.doCallbacks(Choreographer.java:555)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.Choreographer.doFrame(Choreographer.java:523)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.os.Handler.handleCallback(Handler.java:615)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.os.Looper.loop(Looper.java:137)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at android.app.ActivityThread.main(ActivityThread.java:4921)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at java.lang.reflect.Method.invokeNative(Native Method)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at java.lang.reflect.Method.invoke(Method.java:511)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
08-11 20:18:38.707: E/AndroidRuntime(23441):    at dalvik.system.NativeStart.main(Native Method)

だから私は明日の期限を迎え、迅速な解決策を見つけなければなりませんでした(つまり、現時点では、効率についてはあまり気にしません - 後でそれについて考えます)。

あなたが私を助けることができれば、それは素晴らしいことです!説明や質問がある場合は、お気軽にコメントを投稿してください。さらに詳しく説明するために最善を尽くします...

前もって感謝します!

更新: だから、何らかの理由で、次のようにコメントしている場合は機能することがわかりましたif:

  //if (itemView == null) {
        if (currentSms.getIncomingOutgoing().equals("in")){// inflate the list for an incoming message
            itemView = getLayoutInflater().inflate(R.layout.item_conversation_incoming, parent, false);
        }
        else{ // inflate the list for an outgoing message
            itemView = getLayoutInflater().inflate(R.layout.item_conversation_outgoing, parent, false);
        }
    //}

しかし、何かが間違っていると教えてくれます...私はそれについて他の視点を聞くことにまだ興味があります...ありがとう

編集:

execption の原因となっている行は次のとおりです。

                contentView.setText(currentSms.getContent());
4

2 に答える 2

1

使用する前に初期化する必要はありませんcurrentSmsか?そうでない場合は、どちらがエラー行であるかを示してください

于 2013-08-11T17:45:43.337 に答える
1

かどうかを確認する最初の,Viewなどの sを初期化する必要があると思います。contentViewtimeViewif..elseitemViewnull

于 2013-08-11T17:57:42.730 に答える