【发布时间】:2021-07-04 22:27:17
【问题描述】:
我有一个发送消息的应用程序。
我想实现删除消息的功能。如果您长时间单击该消息,则会出现一个标记的复选框。接下来,用户可以选择他要删除的所有消息,然后单击垃圾桶图标。
消息是使用 RecyclerView 实现的。使用 LiveData 和 Room。
这是ListAdapter 的样子:
package com.mardaunt.telesupp.recyclerview;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import com.mardaunt.telesupp.R;
import com.mardaunt.telesupp.room.Message;
import com.mardaunt.telesupp.room.TimeStampConverter;
public class MessageListAdapter extends ListAdapter<Message, MessageViewHolder> {
public MessageListAdapter(@NonNull DiffUtil.ItemCallback<Message> diffCallback) {
super(diffCallback);
}
@Override
public int getItemViewType(int position) {
if (getItem(position).getNature().equals("outgoing"))
return R.layout.recyclerview_item_outgoing;
else
return R.layout.recyclerview_item_incoming;
}
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return MessageViewHolder.create(parent, viewType);
}
@Override
public void onBindViewHolder(MessageViewHolder holder, int position) {
Message current = getItem(position);
holder.bind(current.getPhone(),
current.getText(),
TimeStampConverter.getTime(current.getDate())); // Бинтим телефон сообщение и время.
}
public static class MessageDiff extends DiffUtil.ItemCallback<Message> {
@Override
public boolean areItemsTheSame(@NonNull Message oldItem, @NonNull Message newItem) {
return oldItem == newItem;
}
@Override
public boolean areContentsTheSame(@NonNull Message oldItem, @NonNull Message newItem) {
return oldItem.getText().equals(newItem.getText());
}
}
}
ViewHolder 是这样的:
package com.mardaunt.telesupp.recyclerview;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.mardaunt.telesupp.R;
class MessageViewHolder extends RecyclerView.ViewHolder {
private final TextView phoneItemView;
private final TextView messageItemView;
private final TextView timeItemView;
private MessageViewHolder(View itemView) {
super(itemView);
messageItemView = itemView.findViewById(R.id.text_view_message);
phoneItemView = itemView.findViewById(R.id.text_view_phone);
timeItemView = itemView.findViewById(R.id.text_view_time);
}
public void bind(String phone, String message, String time) {
phoneItemView.setText(phone);
messageItemView.setText(message);
timeItemView.setText(time);
}
//viewType содержит id для нужного layout.
static MessageViewHolder create(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(viewType, parent, false);
return new MessageViewHolder(view);
}
}
请告诉我如何正确启动此任务?如果我认为正确的话,我需要在 MessageListAdapter 类中设置一个长按消息的侦听器。
MainActivity 在 GitHub 上。
应用程序的工作原型 (apk file)。
【问题讨论】:
标签: java android android-recyclerview android-room android-livedata