Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why so much space between two row (message) in recylerview android

enter image description here

i am facing two problem.why there are too space between two row(message) in recylerview.i am trying to make a chat app by recyclerview.why message not coming while entering the activity,rather message come while message edittext text clicked.

my code:

chat layout myself:

<TextView
    android:id="@+id/message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
    android:textIsSelectable="true"
    android:background="@drawable/bg_bubble_gray"
    android:textSize="14dp" />

<TextView
    android:id="@+id/timestamp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@id/message"
    android:layout_below="@id/message"
    android:layout_marginBottom="25dp"
    android:padding="10dp"
    android:textSize="10dp" />

chat layout myself:



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

        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="10dp"
            android:textIsSelectable="true"
            android:background="@drawable/bg_bubble_white"
            android:textSize="14dp" />

        <TextView
            android:id="@+id/timestamp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@id/message"
            android:layout_marginBottom="25dp"
            android:layout_marginLeft="10dp"
            android:paddingLeft="10dp"
            android:paddingTop="6dp"
            android:textSize="10dp" />

    </LinearLayout>

adapter:

public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static String TAG = ChatRoomThreadAdapter.class.getSimpleName();

private String userId;
private int SELF = 100;
private static String today;

private Context mContext;
private ArrayList<Message> messageArrayList;


public class ViewHolder extends RecyclerView.ViewHolder {
    TextView message, timestamp;

    public ViewHolder(View view) {
        super(view);
        message = (TextView) itemView.findViewById(R.id.message);
        timestamp = (TextView) itemView.findViewById(R.id.timestamp);
    }
}

public ChatRoomThreadAdapter(Context mContext, ArrayList<Message> messageArrayList, String userId) {
    this.mContext = mContext;
    this.messageArrayList = messageArrayList;
    this.userId = userId;

    Calendar calendar = Calendar.getInstance();
    today = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView;

    // view type is to identify where to render the chat message
    // left or right
    if (viewType == SELF) {
        // self message
        itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.chat_layout_myself, parent, false);
    } else {
        // others message
        itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.chat_layout_other, parent, false);
    }


    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    Message message = messageArrayList.get(position);
    ((ViewHolder) holder).message.setText(message.getMessage());

    String timestamp = getTimeStamp(message.getCreatedAt());

    if (message.getUser().getName() != null)
        timestamp = message.getUser().getName() + ", " + timestamp;

    ((ViewHolder) holder).timestamp.setText(timestamp);

}

@Override
public int getItemViewType(int position) {
    Message message = messageArrayList.get(position);
    if (message.getUser().getId().equals(userId)) {
        return SELF;
    }

    return position;
}


@Override
public int getItemCount() {
    return messageArrayList.size();
}

public static String getTimeStamp(String dateStr) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String timestamp = "";

    today = today.length() < 2 ? "0" + today : today;

    try {
        Date date = format.parse(dateStr);
        SimpleDateFormat todayFormat = new SimpleDateFormat("dd");
        String dateToday = todayFormat.format(date);
        format = dateToday.equals(today) ? new SimpleDateFormat("hh:mm a") : new SimpleDateFormat("dd LLL, hh:mm a");
        String date1 = format.format(date);
        timestamp = date1.toString();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return timestamp;
}
}

chat content layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.systechdigital.webadeal.ChatActivity"
    tools:showIn="@layout/activity_chat">


    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/listFooter"
        android:layout_alignParentTop="true"
        android:transcriptMode="alwaysScroll"
        android:background="#393839"
        />

    <LinearLayout
        android:id="@+id/listFooter"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/messageInput"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:inputType="textShortMessage"
            android:lines="1"
            android:singleLine="true" />

        <ImageButton
            android:id="@+id/sendButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/ic_menu_send" />
    </LinearLayout>



</RelativeLayout>

chat activity:

public class ChatRoomActivity extends AppCompatActivity {


private String TAG = ChatRoomActivity.class.getSimpleName();

private String chatRoomId;
private RecyclerView recyclerView;
private ChatRoomThreadAdapter mAdapter;
private ArrayList<Message> messageArrayList;
private EditText inputMessage;
private Button btnSend;
private AsyncTaskClass backgroundTask;
private Context context_chatLisActivity;
private ProgressDialog progressDialog;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat_room);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    inputMessage = (EditText) findViewById(R.id.message);
    btnSend = (Button) findViewById(R.id.btn_send);
    context_chatLisActivity=ChatRoomActivity.this;

    chatRoomId = InfoSetClass.getRoom_id();
    Log.v("ResDRoomId",chatRoomId);
 //        String title = intent.getStringExtra("name");

//        getSupportActionBar().setTitle(title);
//        getSupportActionBar().setDisplayHomeAsUpEnabled(true);



    if (chatRoomId == null) {
        Toast.makeText(getApplicationContext(), "Chat room not found!", Toast.LENGTH_SHORT).show();
        finish();
    }

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    messageArrayList = new ArrayList<>();


    // self user id is to identify the message owner
    String selfUserId = InfoSetClass.getOwn_UserId();

    mAdapter = new ChatRoomThreadAdapter(this, messageArrayList, selfUserId);

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

 /*   mRegistrationBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Config.PUSH_NOTIFICATION)) {
                // new push message is received

            }
        }
    };*/

    btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendMessage();
        }
    });

    fetchChatThread();

}





/**
 * Posting a new message in chat room
 * will make an http call to our server. Our server again sends the message
 * to all the devices as push notification
 * */

private void sendMessage() {
    final String message = this.inputMessage.getText().toString().trim();

    if (TextUtils.isEmpty(message)) {
        Toast.makeText(getApplicationContext(), "Enter a message", Toast.LENGTH_SHORT).show();
        return;
    }




    this.inputMessage.setText("");

    StringRequest strReq = new StringRequest(Request.Method.POST,
            endPoint, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.v("ResDSNDMsg ", response);

            try {
                JSONObject obj = new JSONObject(response);

                // check for error
                if (obj.getBoolean("error") == false) {
                    JSONObject commentObj = obj.getJSONObject("message");

                    /*String commentId = commentObj.getString("message_id");
                    String commentText = commentObj.getString("message");
                    String createdAt = commentObj.getString("created_at");

                    JSONObject userObj = obj.getJSONObject("user");
                    String userId = userObj.getString("user_id");
                    String userName = userObj.getString("name");
                    User user = new User(userId, userName, null);

                    Message message = new Message();
                    message.setId(commentId);
                    message.setMessage(commentText);
                    message.setCreatedAt(createdAt);*/


//                        messageArrayList.add(message);

                    mAdapter.notifyDataSetChanged();
                    if (mAdapter.getItemCount() > 1) {
                        // scrolling to bottom of the recycler view
                        recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1);
                    }

                } else {
                    Toast.makeText(getApplicationContext(), "" + obj.getString("message"), Toast.LENGTH_LONG).show();
                }

            } catch (JSONException e) {
                Log.e(TAG, "json parsing error: " + e.getMessage());
                Toast.makeText(getApplicationContext(), "json parse error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            NetworkResponse networkResponse = error.networkResponse;
            Log.e(TAG, "Volley error: " + error.getMessage() + ", code: " + networkResponse);
            Toast.makeText(getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
            inputMessage.setText(message);
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("user_id", MyApplication.getInstance().getPrefManager().getUser().getId());
            params.put("message", message);

            Log.e(TAG, "Params: " + params.toString());

            return params;
        };
    };

    // disabling retry policy so that it won't make
    // multiple http calls

    int socketTimeout = 0;
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);

    strReq.setRetryPolicy(policy);

    //Adding request to request queue
    MyApplication.getInstance().addToRequestQueue(strReq);
}


/**
 * Fetching all the messages of a single chat room
 * */
private void fetchChatThread() {

    progressDialog = new ProgressDialog(ChatRoomActivity.this);
    progressDialog.setMessage("Please wait.....");
    progressDialog.show();

    String chatFetch = "";

    backgroundTask = new AsyncTaskClass(context_chatLisActivity);

    new android.os.Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
//                progressDialog.dismiss();

            if (progressDialog.isShowing()) {
                try {
                    progressDialog.dismiss();
                } catch (Exception e) {// nothing }

                }
            }

            String result = backgroundTask.getResponse(1);

            Log.v("ResDMSGFetch", result);

            try {
                JSONObject js = new JSONObject(result);
//            Log.v("ResDFrJ",js.toString());
                JSONArray arr = js.getJSONArray("");

                for (int i = 0; i < arr.length(); i++) {
                    JSONObject tmpOb = new JSONObject(arr.optString(i));



                }


                mAdapter.notifyDataSetChanged();
                if (mAdapter.getItemCount() > 1) {
                    recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1);
                } else {
                    Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG).show();
                }

            } catch (JSONException e) {

                Log.v("JSONExp_Users", e.toString());

            }

        }
    }, 3000);


   /* StringRequest strReq = new StringRequest(Request.Method.GET,
            endPoint, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.v("ResDMSGFetch: ", response);

            try {
                JSONObject obj = new JSONObject(response);

                // check for error
                if (obj.getBoolean("error") == false) {
                    JSONArray commentsObj = obj.getJSONArray("result");

                    for (int i = 0; i < commentsObj.length(); i++) {
                        JSONObject commentObj = (JSONObject) commentsObj.get(i);

                        String commentId = commentObj.getString("message_id");
                        String commentText = commentObj.getString("message");
                        String createdAt = commentObj.getString("created_at");

                        JSONObject userObj = commentObj.getJSONObject("user");
                        String userId = userObj.getString("user_id");
                        String userName = userObj.getString("username");
                        User user = new User(userId, userName, null);

                        Message message = new Message();
                        message.setId(commentId);
                        message.setMessage(commentText);
                        message.setCreatedAt(createdAt);
                        message.setUser(user);

                        messageArrayList.add(message);
                    }

                    mAdapter.notifyDataSetChanged();
                    if (mAdapter.getItemCount() > 1) {
                        recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1);
                    }

                } else {
                    Toast.makeText(getApplicationContext(), "" + obj.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show();
                }

            } catch (JSONException e) {
                Log.e(TAG, "json parsing error: " + e.getMessage());
                Toast.makeText(getApplicationContext(), "json parse error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            NetworkResponse networkResponse = error.networkResponse;
            Log.e(TAG, "Volley error: " + error.getMessage() + ", code: " + networkResponse);
            Toast.makeText(getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    //Adding request to request queue
    MyApplication.getInstance().addToRequestQueue(strReq);*/
}

}

i need some badly help.please do help me by solving this 2 problem.

like image 580
AAA Avatar asked Nov 18 '25 06:11

AAA


1 Answers

The problem is simple. You are telling each layouts height to be MATCH_PARENT. Change the android:layout_height="match_parent" to android:layout_height="wrap_content".

This tells the layout to have an height wrapping its children or contents. You can use padding or margin as required to increase/decrease the spacing between consecutive rows.

So, the final code in chat_layout_myself.xml should be,

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingTop="5dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        >

        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="10dp"
            android:textIsSelectable="true"
            android:background="@drawable/bg_bubble_white"
            android:textSize="14dp" />

        <TextView
            android:id="@+id/timestamp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@id/message"
            android:layout_marginBottom="25dp"
            android:layout_marginLeft="10dp"
            android:paddingLeft="10dp"
            android:paddingTop="6dp"
            android:textSize="10dp" />

    </LinearLayout>
like image 61
Aritra Roy Avatar answered Nov 19 '25 21:11

Aritra Roy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!