In my application I have a conversation room. All of my messages should be aligned to right while the rest should be left aligned.
Single row of my list is like this:
<?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:id="@+id/llContainer" >
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/speech_bubble_orange"
android:id="@+id/llGroup" >
<TextView
android:id="@+id/message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shadowColor="@color/message_textShadow"
android:shadowDx="1"
android:shadowDy="1"
android:text="Medium Text"
android:textColor="@color/message_textColor"
android:textSize="20sp" />
<TextView
android:id="@+id/message_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/temp_date"
android:gravity="right"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"/>
</LinearLayout>
</LinearLayout>
getView() of my adapter is like this:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = myInflater.inflate(R.layout.list_message_row, null);
holder = new ViewHolder();
holder.tvMessageBody = (TextView) convertView.findViewById(R.id.message_text);
holder.tvMessageDate = (TextView) convertView.findViewById(R.id.message_date);
holder.llContainer = (LinearLayout) convertView.findViewById(R.id.llContainer);
holder.llGroup = (LinearLayout) convertView.findViewById(R.id.llGroup);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvMessageBody.setText(messageList.get(position).getMessageBody());
String date = messageList.get(position).getSentDate();
holder.tvMessageDate.setText(formatFanciedDate(date));
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.llContainer.getLayoutParams();
try {
if(messageList.get(position).isMine()) {
holder.llGroup.setBackgroundResource(R.drawable.speech_bubble_green);
params.gravity = Gravity.RIGHT;
}
//If not mine then it is from sender to show orange background and align to left
else {
holder.llGroup.setBackgroundResource(R.drawable.speech_bubble_orange);
params.gravity = Gravity.LEFT;
}
holder.llContainer.setLayoutParams(params);
} catch (NullPointerException e) {
e.printStackTrace();
}
return convertView;
}
I think everything should be fine however when I run the application NullPointerException happens and points to params.gravity = Gravity.RIGHT;
or params.gravity = Gravity.LEFT;
(depends on isMine() method).
What you think? Where is my mistake? Any suggestion would be appreciated.
getLayoutParams()
will return null
until the view is attached to its parent.
Try to create the layout params with its constructor rather than using getLayoutParams()
.
Use RelativeLayout params and set gravity like this, it will work.
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
This is working for me in my application.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With