私は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());