Search code examples
androidandroid-recyclerviewandroid-gravity

android How to set Gravity in RecyclerView


I'm trying to make a chat app, and having a trouble with setting gravity of custom view in the RecyclerView. I've been searching and trying a whole day, but i couldn't make, it always shows like this(ScreenShot).It should be located right of screen not left. But in Android Studio Preview, It shows correctly.Im attaching my source.. please tell me what's wrong..

  1. In MainActivity.xml (RecyclerView)

    ......
    <RelativeLayout
        android:background="#9cbad8"
        android:layout_weight="70"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:layout_alignParentRight="true"
        android:paddingBottom="5dp"
        android:listSelector="@drawable/bg_transparent"
        android:cacheColorHint="@android:color/transparent"
        android:paddingTop="50dp"
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    </RelativeLayout>
    .......
    

2.In MessageItem.xml (I set graivity Right, and screenshot shows correctly)

<LinearLayout
        android:id="@+id/my_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
            <LinearLayout
                android:id="@+id/my_normal_layout"
                android:orientation="horizontal"
                android:gravity="end"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/my_time"
                        android:textSize="10sp"
                        android:layout_marginRight="5dp"
                        android:layout_gravity="bottom"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="오후 15:15"/>

                    <TextView
                        android:textAlignment="center"
                        android:layout_marginTop="5dp"
                        android:layout_marginRight="5dp"
                        android:maxWidth="200dp"
                        android:textSize="14sp"
                        android:lineSpacingMultiplier="1.2"
                        android:gravity="center_vertical"
                        android:paddingLeft="10dp"
                        android:paddingRight="15dp"
                        android:paddingTop="8dp"
                        android:paddingBottom="8dp"
                        android:background="@drawable/bubble_my"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textColor="#000000"
                        android:text="this is Test"
                        android:id="@+id/my_normal_text" />
            </LinearLayout>
</LinearLayout>

Android Layout Preview shows well(ScreenShot)

  1. My RecyclerViewHolder

    public class ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout myLayout;
        LinearLayout myNormarLayout;
        LinearLayout myMoreLayout;
    
        public ViewHolder(View v) {
            super(v);
            myLayout = (LinearLayout)v.findViewById(R.id.my_layout);
            myNormarLayout = (LinearLayout)v.findViewById(R.id.my_normal_layout);
            myMoreLayout = (LinearLayout)v.findViewById(R.id.my_more_layout);
        }
    }
    
  2. Also in my RecyclerViewAdapter, I changed Gravity Again..

    ....
    holder.myNormarLayout.setVisibility(View.VISIBLE);
    holder.myNormarLayout.setGravity(Gravity.Right);
    ....
    

I had tried almost of things from searching, but they didn't work for this.. please... help me


Solution

  • You could use the Constraint Layout for better performance.

    In your case maybe adding a weighted view between the time and text could help, try this

    <LinearLayout
        android:id="@+id/my_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
            <LinearLayout
                android:id="@+id/my_normal_layout"
                android:orientation="horizontal"
                android:gravity="end"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                    <TextView
                        android:id="@+id/my_time"
                        android:textSize="10sp"
                        android:layout_marginRight="5dp"
                        android:layout_gravity="bottom"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="오후 15:15"/>
                    <View
                          android:layout_height="0dp"
                          android:layout_width="0dp"
                          android:layout_weight="0"
                          />
                    <TextView
                        android:textAlignment="center"
                        android:layout_marginTop="5dp"
                        android:layout_marginRight="5dp"
                        android:maxWidth="200dp"
                        android:textSize="14sp"
                        android:lineSpacingMultiplier="1.2"
                        android:gravity="center_vertical"
                        android:paddingLeft="10dp"
                        android:paddingRight="15dp"
                        android:paddingTop="8dp"
                        android:paddingBottom="8dp"
                        android:background="@drawable/bubble_my"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textColor="#000000"
                        android:text="this is Test"
                        android:id="@+id/my_normal_text" />
            </LinearLayout>