В настоящее время я работаю над приложением для чата, которое использует Smack и XMPP Server. Я сохраняю все сообщения в базе данных и загружаю фрагмент с помощью адаптера курсора в ListView.
Код ниже не отображает сообщения в ListView и аварийно завершает работу при вызове загрузчика курсора. заранее спасибо
private LayoutInflater mInflater;
private int mChatType;
private ReceiveMediaMessage receiveMediaMessage;
private ArrayList mArrayList;
private File pathDirectory;
private LayoutInflater inflater;
public CustomMessageCursorAdapter(Context context, Cursor c, int chatType) {
super(context, c);
mChatType = chatType;
mAutoRequery = true;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
if (view != null) {
ViewHolder holder = (ViewHolder) view.getTag();
int jidCol = cursor.getColumnIndexOrThrow(DbHelper.USERS_JID);
int nicknameColId = cursor.getColumnIndexOrThrow(DbHelper.USERS_NAME);
String jid = cursor.getString(jidCol);
String nickname = cursor.getString(nicknameColId);
MessageContainer messageContainer = MessageContainer.fromCursor(cursor);
DateFormat df = new SimpleDateFormat("[dd.MM.yyyy HH:mm:ss]");
String createdAtDate = df.format(messageContainer.getCreated());
Log.v(Constants.LOG, messageContainer.getUserId());
if (messageContainer.getBody() != null) {
if (messageContainer.getIncoming() == 0) {
//myMessages
holder.chatContainer.setGravity(Gravity.RIGHT);
if (messageContainer.getBody().contains(ChatConstants.IMAGE_MESSAGE)) {
holder.imageView.setBackgroundResource(R.drawable.grey);
receiveImage(messageContainer.getBody(), holder);
} else if (messageContainer.getBody().contains(ChatConstants.VIDEO_MESSAGE)) {
} else if (messageContainer.getBody().contains(ChatConstants.AUDIO_MESSAGE)) {
} else if (messageContainer.getBody().contains(ChatConstants.DOCS_MESSAGE)) {
} else{
holder.messageText.setBackgroundResource(R.drawable.grey);
holder.messageText.setText(messageContainer.getBody());
}
} else {
// other's messages
holder.chatContainer.setGravity(Gravity.LEFT);
if (messageContainer.getBody().contains(ChatConstants.IMAGE_MESSAGE)) {
holder.imageView.setBackgroundResource(R.drawable.red);
receiveImage(messageContainer.getBody(), holder);
} else if (messageContainer.getBody().contains(ChatConstants.VIDEO_MESSAGE)) {
} else if (messageContainer.getBody().contains(ChatConstants.AUDIO_MESSAGE)) {
} else if (messageContainer.getBody().contains(ChatConstants.DOCS_MESSAGE)) {
} else {
holder.messageText.setBackgroundResource(R.drawable.red);
holder.messageText.setTextColor(context.getResources().getColor(R.color.primary_text_material_light));
holder.messageText.setText(messageContainer.getBody());
}
}
}
if (mChatType == ChatConstants.MULTICHAT_CHAT_STATE) {
//holder.from.setText(nickname);
} else {
//holder.from.setText(jid);
}
//holder.messageDate.setText(createdAtDate);
}
}
private void receiveImage(String body, final ViewHolder holder) {
mArrayList = new ArrayList();
String fid = splitFid(body);
receiveMediaMessage = new ReceiveMediaMessage(mContext, new ReceiveMediaMessage.ReceiveMediaMessageCallBack() {
@Override
public void onStart() {
}
@Override
public void onEnd(ArrayList response) {
mArrayList = response;
pathDirectory = new File(Constants.IMAGE_THUMB_PATH + "IMAGE_" + mArrayList.get(Constants.FID_INDEX).toString() + ".jpg");
if (pathDirectory.exists()) {
Bitmap myBitmap = BitmapFactory.decodeFile(pathDirectory.getAbsolutePath());
holder.imageView.setImageBitmap(myBitmap);
}
}
});
receiveMediaMessage.execute(fid);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = null;
ViewHolder holder = new ViewHolder();
inflater = LayoutInflater.from(context);
MessageContainer messageContainer = MessageContainer.fromCursor(cursor);
if (messageContainer.getBody().contains(ChatConstants.EDUCHAT_IMAGE_MESSAGE)) {
v = inflater.inflate(R.layout.fragment_chat_image_view_row_layout, parent, false);
holder.imageView = (ImageView) v.findViewById(R.id.fragment_chat_image_view_row);
holder.chatContainer = (LinearLayout) v.findViewById(R.id.fragment_chat_image_view_container);
} else {
v = inflater.inflate(R.layout.fragment_chat_text_view_layout, parent, false);
holder.messageText = (TextView) v.findViewById(R.id.fragment_chat_text_view_row);
holder.chatContainer = (LinearLayout) v.findViewById(R.id.fragment_chat_text_view_container);
}
v.setTag(holder);
return v;
}
private static class ViewHolder {
LinearLayout chatContainer;
TextView messageText;
ImageView imageView;
}
private String splitFid(String data) {
String delimiter = "_";
String[] temp = data.split(delimiter);
return temp[2];
}
@Override public int getItemViewType (int position) { return super.getItemViewType (position); }
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public Object getItem(int position) {
return super.getItem(position);
}
Ошибка
02-10 00:14:19.125 25518-25518/in.tekticks.educhat E/InputEventReceiver: Exception dispatching input event.
02-10 00:14:19.126 25518-25518/in.tekticks.educhat E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
02-10 00:14:19.127 25518-25518/in.tekticks.educhat E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setBackgroundResource(int)' on a null object reference
at in.tekticks.educhat.adapters.CustomMessageCursorAdapter.bindView(CustomMessageCursorAdapter.java:73)
at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
at android.widget.AbsListView.obtainView(AbsListView.java:2344)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillUp(ListView.java:732)
at android.widget.ListView.fillGap(ListView.java:671)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:4008)
at android.view.View.dispatchGenericMotionEventInternal(View.java:8493)
at android.view.View.dispatchGenericMotionEvent(View.java:8474)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:2322)
at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1702)
at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2775)
at android.support.v7.view.WindowCallbackWrapper.dispatchGenericMotionEvent(WindowCallbackWrapper.java:70)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:2289)
at android.view.View.dispatchPointerEvent(View.java:8580)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4021)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3887)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl.deliver
02-10 00:14:19.130 25518-25518/in.tekticks.educhat E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.tekticks.educhat, PID: 25518
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setBackgroundResource(int)' on a null object reference
at in.tekticks.educhat.adapters.CustomMessageCursorAdapter.bindView(CustomMessageCursorAdapter.java:73)
at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
at android.widget.AbsListView.obtainView(AbsListView.java:2344)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillUp(ListView.java:732)
at android.widget.ListView.fillGap(ListView.java:671)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:4008)
at android.view.View.dispatchGenericMotionEventInternal(View.java:8493)
at android.view.View.dispatchGenericMotionEvent(View.java:8474)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:2024)
at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1975)
at android.view.View.dispatchGenericMotionEvent(View.java:8467)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:2322)
at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1702)
at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2775)
at android.support.v7.view.WindowCallbackWrapper.dispatchGenericMotionEvent(WindowCallbackWrapper.java:70)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:2289)
at android.view.View.dispatchPointerEvent(View.java:8580)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4021)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3887)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476)
at android.view.ViewRootImpl$InputStage.deliver(