我正在使用android recycler view创建聊天布局
activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="ch.uffapp.recyclerview.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="100dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="opponent text message"
android:id="@+id/opponent_send_text_message"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="opponent image message"
android:id="@+id/opponent_send_image_message"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="own text message"
android:id="@+id/own_send_text_message"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="own image message"
android:id="@+id/own_send_image_message" />
</LinearLayout>
</RelativeLayout>
recycler_view_item
<RelativeLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/private_dialog_item_view">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:id="@+id/private_dialog_message_view"/>
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:id="@+id/private_dialog_image_view"/>
</RelativeLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="right">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:id="@+id/private_dialog_time_view"
android:text="09:00 pm"
android:layout_marginRight="10dp"
android:textSize="10dp"
android:layout_marginBottom="5dp"/>
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:src="@drawable/ic_message_read_icon"
android:layout_marginRight="5dp"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
{
private Context context;
private List<UffMessage> uffMessages = new ArrayList<>();
public MyAdapter(Context context, List<UffMessage> uffMessages) {
this.context = context;
this.uffMessages = uffMessages;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView messageView;
private TextView timeView;
private ImageView imageView;
private LinearLayout itemBOdy;
public MyViewHolder(View itemView) {
super(itemView);
messageView = (TextView)
itemView.findViewById(R.id.private_dialog_message_view);
timeView = (TextView)
itemView.findViewById(R.id.private_dialog_time_view);
imageView = (ImageView)
itemView.findViewById(R.id.private_dialog_image_view);
itemBOdy = (LinearLayout)
itemView.findViewById(R.id.private_dialog_item_view);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_view_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
resetUI(holder);
UffMessage uffMessage = uffMessages.get(position);
if (uffMessage.isOwnMessage) {
makeOwn(holder);
} else {
makeOpponent(holder);
}
switch (uffMessage.messageType) {
case "text":
holder.messageView.setVisibility(View.VISIBLE);
holder.messageView.setText(uffMessage.textMessage);
holder.timeView.setText(uffMessage.messageTime);
break;
case "image":
holder.imageView.setVisibility(View.VISIBLE);
holder.imageView.setImageResource(R.drawable.edge6);
holder.timeView.setText(uffMessage.messageTime);
break;
}
}
@Override
public int getItemCount() {
return uffMessages.size();
}
private void resetUI(MyViewHolder holder) {
holder.messageView.setVisibility(View.GONE);
holder.imageView.setVisibility(View.GONE);
}
private void makeOpponent(MyViewHolder holder) {
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)
holder.itemBOdy.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
holder.itemBOdy.setLayoutParams(params);
holder.itemBOdy.setBackgroundColor(context.getResources()
.getColor(R.color.colorPrimary));
}
private void makeOwn(MyViewHolder holder) {
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)
holder.itemBOdy.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
holder.itemView.setLayoutParams(params);
holder.itemBOdy.setBackgroundColor(context.getResources()
.getColor(R.color.colorAccent));
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements
View.OnClickListener {
private Button ownTextMessageBtn;
private Button ownImageMessageBtn;
private Button opponentTextMessageBtn;
private Button opponentImageMessageBtn;
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private List<UffMessage> uffMessages = new ArrayList<>();
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ownTextMessageBtn = (Button) findViewById(R.id.own_send_text_message);
ownImageMessageBtn = (Button) findViewById(R.id.own_send_image_message);
opponentTextMessageBtn = (Button)
findViewById(R.id.opponent_send_text_message);
opponentImageMessageBtn = (Button)
findViewById(R.id.opponent_send_image_message);
layoutManager = new LinearLayoutManager(this);
layoutManager.setStackFromEnd(true);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(layoutManager);
ownTextMessageBtn.setOnClickListener(this);
ownImageMessageBtn.setOnClickListener(this);
opponentTextMessageBtn.setOnClickListener(this);
opponentImageMessageBtn.setOnClickListener(this);
myAdapter = new MyAdapter(getApplicationContext(), uffMessages);
recyclerView.setAdapter(myAdapter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.own_send_text_message:
uffMessages.add(new UffMessage("hi how are you", "12:00 pm",
R.drawable.edge6, "text", true));
myAdapter.notifyDataSetChanged();
break;
case R.id.own_send_image_message:
uffMessages.add(new UffMessage("hi how are you", "12:00 pm",
R.drawable.edge6, "image", true));
myAdapter.notifyDataSetChanged();
break;
case R.id.opponent_send_text_message:
uffMessages.add(new UffMessage("hi how are you", "12:00 pm",
R.drawable.edge6, "text", false));
myAdapter.notifyDataSetChanged();
break;
case R.id.opponent_send_image_message:
uffMessages.add(new UffMessage("hi how are you", "12:00 pm",
R.drawable.edge6, "image", false));
myAdapter.notifyDataSetChanged();
break;
}
}
}
但问题是某些视图自动扩展,我想左右对齐而不扩展它们。
答案 0 :(得分:1)
在您滚动规则
之后,视图会被回收params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
堆叠在一个视图上,导致视图拉伸。
为什么不用简单易懂的RelativeLayout
替换效率低下的FrameLayout
并使用重力代替?
final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) holder.itemBOdy.getLayoutParams();
params.gravity = GravityCompat.START; // or GravityCompat.END
holder.itemBOdy.setLayoutParams(params);
答案 1 :(得分:0)
最好的方法是具有单元格布局,以便您可以在单元格内向左/向右对齐项目:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/layout_msg_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
</LinearLayout>
并且在视图持有器中,您可以通过父版式的android:gravity
属性(在这种情况下为layout_msg_container
)来更改内容的左/右对齐。
LinearLayout layoutContainer = itemView.findViewById(R.id.layout_msg_container);
layoutContainer.setGravity(Gravity.END);
或
layoutContainer.setGravity(Gravity.START);