Android 如何将键入点添加到recyclerview
您好,我正在尝试使用Socket.IO创建1on1聊天,但是我已经发出了声音,然后其他部分正在向我输入,但是我的问题是我不知道如何从这个github添加加载点: 我正在尝试让它看起来像facebook messenger,然后有人在这里键入以下图片: My activity_chat.xml:Android 如何将键入点添加到recyclerview,android,android-recyclerview,recyclerview-layout,Android,Android Recyclerview,Recyclerview Layout,您好,我正在尝试使用Socket.IO创建1on1聊天,但是我已经发出了声音,然后其他部分正在向我输入,但是我的问题是我不知道如何从这个github添加加载点: 我正在尝试让它看起来像facebook messenger,然后有人在这里键入以下图片: My activity_chat.xml: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:a
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:background="#EEEEEE"
tools:context=".ui.activity.UserChatActivity">
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/tools"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/fitnessm8_green"
android:fitsSystemWindows="true">
<ImageView android:layout_gravity="center_vertical" android:id="@id/button_back" android:onClick="BackButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/back_arrow" android:layout_marginRight="30dp" />
<FrameLayout android:id="@+id/profile_photo_thumbnail_frame" android:padding="3.0dip" android:layout_width="?actionBarSize" android:layout_height="?actionBarSize">
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/avater_image"
android:src="@drawable/ic_no_user"
android:layout_width="50dp"
android:layout_height="50dp"
app:civ_border_width="2dp"
app:civ_border_color="#FFFFFF"/>
</FrameLayout>
<TextView android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" android:textColor="@android:color/white" android:id="@+id/chat_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:drawablePadding="5.0dip" android:layout_toRightOf="@+id/avater_image" android:layout_centerVertical="true" />
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_messages"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="0dp"
app:layout_constraintBottom_toTopOf="@id/relativeLayout_message"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
<RelativeLayout
android:id="@+id/relativeLayout_message"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0">
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_send_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:tint="?attr/colorPrimaryDark"
app:fabSize="mini"
app:srcCompat="@drawable/ic_image_black_24dp" />
<android.support.design.widget.TextInputEditText
android:id="@+id/editText_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_toEndOf="@id/fab_send_image"
android:background="@drawable/rect_oval_white"
android:elevation="2dp"
android:hint="Fire your message"
android:padding="8dp" />
<ImageView
android:id="@+id/imageView_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="24dp"
android:elevation="2dp"
app:srcCompat="@drawable/ic_send_black_24dp" />
</RelativeLayout>
我的适配器在这里:
public class ChatRoomThreadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private String userId;
private int SELF = 100;
private static String today;
private Context mContext;
private ArrayList<ChatMessages> messageArrayList;
public class ViewHolder extends RecyclerView.ViewHolder {
TextView message, timestamp, readedstatus;
ImageView profileimage;
public ViewHolder(View view) {
super(view);
message = (TextView) itemView.findViewById(R.id.message);
timestamp = (TextView) itemView.findViewById(R.id.timestamp);
readedstatus = (TextView) itemView.findViewById(R.id.readedstatus);
profileimage = (ImageView) itemView.findViewById(R.id.avater_image);
}
}
public ChatRoomThreadAdapter(Context mContext, ArrayList<ChatMessages> 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;
if (viewType == SELF) {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_message_right, parent, false);
} else {
itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_message_left, parent, false);
}
return new ViewHolder(itemView);
}
@Override
public int getItemViewType(int position) {
ChatMessages message = messageArrayList.get(position);
if (message.getUser().getUserId().equals(userId)) {
return SELF;
}
return position;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
ChatMessages message = messageArrayList.get(position);
String timestamp = TextUtils.getDateTimeStampWithTime(message.getCreatedAt());
String fimage = message.getUser().getUserprofilepicture();
String readedat = TextUtils.getDateTimeStampWithTime(message.getReadedAt());
if (message.getUser().getUserId().equals(userId)) {
// Self
((ViewHolder) holder).message.setText(message.getMessage());
if (message.getUser().getUsername() != null)
((ViewHolder) holder).timestamp.setText(timestamp);
((ViewHolder) holder).readedstatus.setVisibility(View.GONE);
((ViewHolder) holder).readedstatus.setVisibility(View.GONE);
} else {
// Other
((ViewHolder) holder).message.setText(message.getMessage());
if (message.getUser().getUsername() != null)
((ViewHolder) holder).timestamp.setText(timestamp);
if (fimage.isEmpty()) {
Picasso.with(mContext).load(R.drawable.ic_no_user)
.resize(80, 80)
.into(((ViewHolder) holder).profileimage);
} else {
Picasso.with(mContext).load(fimage)
.resize(80, 80)
.into(((ViewHolder) holder).profileimage);
}
if (message.getReadedAt().toString().equals("0")){
((ViewHolder) holder).readedstatus.setText(mContext.getResources().getString(R.string.message_delivered));
} else {
((ViewHolder) holder).readedstatus.setText(mContext.getResources().getString(R.string.message_readed_at) + " " + readedat);
}
}
}
@Override
public int getItemCount() {
return messageArrayList.size();
}
}
公共类聊天室线程适配器扩展了RecyclerView.Adapter{
私有字符串用户标识;
私人int SELF=100;
今天的私有静态字符串;
私有上下文;
私有ArrayList消息ArrayList;
公共类ViewHolder扩展了RecyclerView.ViewHolder{
TextView消息、时间戳、readedstatus;
图像视图轮廓图像;
公共视图持有者(视图){
超级(视图);
message=(TextView)itemView.findViewById(R.id.message);
timestamp=(TextView)itemView.findViewById(R.id.timestamp);
readedstatus=(TextView)itemView.findViewById(R.id.readedstatus);
profileimage=(ImageView)itemView.findViewById(R.id.avater\u image);
}
}
公共聊天室线程适配器(上下文mContext、ArrayList messageArrayList、字符串userId){
this.mContext=mContext;
this.messageArrayList=messageArrayList;
this.userId=userId;
日历=Calendar.getInstance();
今天=String.valueOf(calendar.get(calendar.DAY/u/u月));
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
查看项目视图;
if(viewType==SELF){
itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.list\u item\u message\u right,parent,false);
}否则{
itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.list\u item\u message\u left,parent,false);
}
返回新的ViewHolder(itemView);
}
@凌驾
public int getItemViewType(int位置){
ChatMessages message=messageArrayList.get(位置);
if(message.getUser().getUserId().equals(userId)){
回归自我;
}
返回位置;
}
@凌驾
public void onBindViewHolder(final RecyclerView.ViewHolder,int位置){
ChatMessages message=messageArrayList.get(位置);
String timestamp=TextUtils.getDateTimeStampWithTime(message.getCreatedAt());
字符串fimage=message.getUser().getUserprofilepicture();
String readedat=TextUtils.getDateTimeStampWithTime(message.getReadedAt());
if(message.getUser().getUserId().equals(userId)){
//自我
((ViewHolder)holder.message.setText(message.getMessage());
if(message.getUser().getUsername()!=null)
((ViewHolder)holder.timestamp.setText(timestamp);
((ViewHolder)holder.readedstatus.setVisibility(View.GONE);
((ViewHolder)holder.readedstatus.setVisibility(View.GONE);
}否则{
//其他
((ViewHolder)holder.message.setText(message.getMessage());
if(message.getUser().getUsername()!=null)
((ViewHolder)holder.timestamp.setText(timestamp);
if(fimage.isEmpty()){
毕加索.with(mContext).load(R.drawable.ic\u no\u用户)
.调整大小(80,80)
.into(((ViewHolder)holder.profileimage);
}否则{
毕加索.with(mContext).load(fimage)
.调整大小(80,80)
.into(((ViewHolder)holder.profileimage);
}
if(message.getReadedAt().toString().equals(“0”)){
((ViewHolder)holder.readedstatus.setText(mContext.getResources().getString(R.string.message_delivered));
}否则{
((ViewHolder)holder.readedstatus.setText(mContext.getResources().getString(R.string.message_readed_at)+“”+readedat);
}
}
}
@凌驾
public int getItemCount(){
返回messageArrayList.size();
}
}
这是我使用recyclerview获取所有消息的代码:
ArrayList androidList = (ArrayList) response.body().getMessages();
messageArrayList = new ArrayList<>(androidList);
mAdapter = new ChatRoomThreadAdapter(getApplicationContext(), messageArrayList, selfUserId);
LinearLayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
if (mAdapter.getItemCount() > 1) {
recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, null, mAdapter.getItemCount() - 1);
}
ArrayList androidList=(ArrayList)response.body().getMessages();
messageArrayList=newarraylist(androidList);
mAdapter=新的聊天室线程适配器(getApplicationContext(),messageArrayList,selfUserId);
LinearLayoutManager布局管理器=新的LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
if(mAdapter.getItemCount()>1){
recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,null,mAdapter.getItemCount()-1);
}
您是否阅读了该回购协议的自述文件?它给你一行你可以包含在你的Gradle配置中,然后你应该能够使用另一个布局文件,其中包括你的RecycleView适配器中的加载视图。是的,我也包括了它,但我不知道如何在RecycleView中显示它如果他们正在键入,您需要使用该视图作为布局向RecyclerView添加一个新项目。@JonathanNet感谢您提出这个问题我得到了dot动画库,实际上我正在寻找相同的项目