CursorAdapter с другим макетом (ImageView, TextView)

В настоящее время я работаю над приложением для чата, которое использует 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(

person Vishnu Nemlawala    schedule 10.02.2016    source источник
comment
Всегда публикуйте полную трассировку стека журнала ошибок, если вы говорите, что произошел сбой.   -  person Doug Stevenson    schedule 10.02.2016


Ответы (1)


Я решил проблему. Спасибо за вашу помощь.

private LayoutInflater mInflater;
private int mChatType;
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) {
    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());

    int viewType = this.getItemViewType(cursor);
    if (view != null) {
        if (messageContainer.getBody() != null) {
            if (viewType == 0) {
                if (messageContainer.getIncoming() == 0) {
                    holder.chatContainer.setGravity(Gravity.RIGHT);
                    holder.imageView.setBackgroundResource(R.drawable.grey);
                    String fid =splitFid(messageContainer.getBody());
                    pathDirectory = new File(Constants.IMAGE_SEND_PATH + "IMAGE_" + fid + ".jpg");
                    Log.v(Constants.LOG, "File path:"+pathDirectory.getAbsolutePath().toString());

                    if (pathDirectory.exists()) {
                        Bitmap myBitmap = BitmapFactory.decodeFile(pathDirectory.getAbsolutePath());
                        holder.imageView.setImageBitmap(myBitmap);
                    }
                } else {
                    holder.chatContainer.setGravity(Gravity.LEFT);
                    holder.imageView.setBackgroundResource(R.drawable.red);
                    String fid =splitFid(messageContainer.getBody());
                    pathDirectory = new File(Constants.IMAGE_THUMB_PATH + "IMAGE_" + fid + ".jpg");
                    if (pathDirectory.exists()) {
                        Bitmap myBitmap = BitmapFactory.decodeFile(pathDirectory.getAbsolutePath());
                        holder.imageView.setImageBitmap(myBitmap);
                    }
                }
            } else {
                if (messageContainer.getIncoming() == 0) {
                    holder.chatContainer.setGravity(Gravity.RIGHT);
                    holder.messageText.setBackgroundResource(R.drawable.grey);
                    holder.messageText.setText(messageContainer.getBody());
                } else {
                    holder.chatContainer.setGravity(Gravity.LEFT);
                    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);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View v = null;
    ViewHolder holder = new ViewHolder();
    inflater = LayoutInflater.from(context);
    int viewType = this.getItemViewType(cursor);
    MessageContainer messageContainer = MessageContainer.fromCursor(cursor);
    if (viewType == 0) {
        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;
}

@Override
public int getItemViewType(int position) {
    Cursor cursor = (Cursor) getItem(position);
    return getItemViewType(cursor);
}

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

@Override
public Object getItem(int position) {
    return super.getItem(position);
}

private int getItemViewType(Cursor cursor) {
    String type = cursor.getString(cursor.getColumnIndex(DbHelper.MESSAGES_BODY));
    if (type.contains(ChatConstants.EDUCHAT_IMAGE_MESSAGE)) {
        return 0;
    } else {
        return 1;
    }
}

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];
}
person Vishnu Nemlawala    schedule 10.02.2016