Java 在哪里操作Recyclerview适配器(Android)中的数据
我的日期时间当前存储为UNIX时间戳。我想在我的Recyclerview中将其显示为h:mm a 我应该在哪里将UNIX时间戳转换为RecyclerView适配器/Viewholder中的正常时间(就最佳性能而言) 我应该在Java 在哪里操作Recyclerview适配器(Android)中的数据,java,android,android-recyclerview,Java,Android,Android Recyclerview,我的日期时间当前存储为UNIX时间戳。我想在我的Recyclerview中将其显示为h:mm a 我应该在哪里将UNIX时间戳转换为RecyclerView适配器/Viewholder中的正常时间(就最佳性能而言) 我应该在RecyclerView.Adapter的getItemViewType(int位置)中执行,还是在ViewHolder类的onBindViewHolder或bind函数中执行 编辑:我的代码 public class ChatListAdapter extends Recy
RecyclerView.Adapter
的getItemViewType(int位置)
中执行,还是在ViewHolder
类的onBindViewHolder
或bind
函数中执行
编辑:我的代码
public class ChatListAdapter extends RecyclerView.Adapter {
private final LayoutInflater mInflater;
private List<Chat> mChats;
private final String ownerMe = "OWNER_ME";
private static final int VIEW_TYPE_MESSAGE_ME = 1;
private static final int VIEW_TYPE_MESSAGE_ME_CORNER = 2;
private static final int VIEW_TYPE_MESSAGE_BF = 3;
private static final int VIEW_TYPE_MESSAGE_BF_CORNER = 4;
ChatListAdapter(Context context) {mInflater = LayoutInflater.from(context);}
@Override
public int getItemViewType(int position) {
Chat chat = mChats.get(position);
if(chat.getUser().equals(ownerMe)) {
if(position == mChats.size()-1) {
return VIEW_TYPE_MESSAGE_ME_CORNER;
}
if(chat.getUser().equals(mChats.get(position+1).getUser())) {
return VIEW_TYPE_MESSAGE_ME;
} else {
return VIEW_TYPE_MESSAGE_ME_CORNER;
}
} else {
if(position == mChats.size()-1) {
return VIEW_TYPE_MESSAGE_BF_CORNER;
}
if(chat.getUser().equals(mChats.get(position+1).getUser())) {
return VIEW_TYPE_MESSAGE_BF;
} else {
return VIEW_TYPE_MESSAGE_BF_CORNER;
}
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if(viewType == VIEW_TYPE_MESSAGE_ME || viewType == VIEW_TYPE_MESSAGE_ME_CORNER) {
view = mInflater.inflate(R.layout.recyclerview_item_right, parent, false);
return new MeMessageHolder(view);
} else if (viewType == VIEW_TYPE_MESSAGE_BF || viewType == VIEW_TYPE_MESSAGE_BF_CORNER) {
view = mInflater.inflate(R.layout.recyclerview_item_left, parent, false);
return new BfMessageHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (mChats != null) {
Chat current = mChats.get(position);
long unixTime= current.getUnixTime();
Date time = new java.util.Date(unixTime*1000L);
SimpleDateFormat sdf = new java.text.SimpleDateFormat("h:mm a");
String formattedTime = sdf.format(time);
switch (holder.getItemViewType()) {
case VIEW_TYPE_MESSAGE_ME:
((MeMessageHolder) holder).bind(current, formattedTime, false);
break;
case VIEW_TYPE_MESSAGE_ME_CORNER:
((MeMessageHolder) holder).bind(current, formattedTime, true);
break;
case VIEW_TYPE_MESSAGE_BF:
((BfMessageHolder) holder).bind(current, formattedTime, false);
break;
case VIEW_TYPE_MESSAGE_BF_CORNER:
((BfMessageHolder) holder).bind(current, formattedTime, true);
break;
}
}
}
class MeMessageHolder extends RecyclerView.ViewHolder {
private final TextView chatItemView;
private final ImageView cornerRightIImageView;
private final ConstraintLayout constraintLayout;
private final TextView timeItemView;
private MeMessageHolder(View itemView) {
super(itemView);
chatItemView = itemView.findViewById(R.id.textView);
cornerRightIImageView = itemView.findViewById(R.id.corner_view_right);
constraintLayout = itemView.findViewById(R.id.chat_bubble_id);
timeItemView = itemView.findViewById(R.id.text_message_time);
}
void bind(Chat chat, String formattedTime, boolean isCorner) {
chatItemView.setText(chat.getMessage());
timeItemView.setText(formattedTime);
if(isCorner) {
constraintLayout.setBackgroundResource(R.drawable.chat_bubble_v2);
} else {
cornerRightIImageView.setVisibility(View.INVISIBLE);
}
}
}
class BfMessageHolder extends RecyclerView.ViewHolder {
private final TextView chatItemView;
private final ImageView cornerLeftImageView;
private final ConstraintLayout constraintLayout;
private final TextView timeItemView;
private BfMessageHolder(View itemView) {
super(itemView);
chatItemView = itemView.findViewById(R.id.textView);
cornerLeftImageView = itemView.findViewById(R.id.corner_view_left);
constraintLayout = itemView.findViewById(R.id.chat_bubble_id);
timeItemView = itemView.findViewById(R.id.text_message_time);
}
void bind(Chat chat, String formattedTime, boolean isCorner) {
chatItemView.setText(chat.getMessage());
timeItemView.setText(formattedTime);
if(isCorner) {
constraintLayout.setBackgroundResource(R.drawable.chat_bubble_v3);
} else {
cornerLeftImageView.setVisibility(View.INVISIBLE);
}
}
}
void setChats(List<Chat> chats) {
mChats = chats;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if(mChats!=null)
return mChats.size();
else return 0;
}
}
公共类ChatListAdapter扩展了RecyclerView.Adapter{
私人最终布局平面图;
私人名单mChats;
私有最终字符串ownerMe=“OWNER\u ME”;
私有静态最终整型视图\类型\消息\ ME=1;
私有静态最终整数视图\类型\消息\我\角=2;
私有静态最终整型视图\类型\消息\ BF=3;
私有静态最终int视图\类型\消息\ BF\角=4;
ChatListAdapter(上下文){mInflater=LayoutInflater.from(上下文);}
@凌驾
public int getItemViewType(int位置){
Chat Chat=mChats.get(位置);
if(chat.getUser().equals(ownerMe)){
if(position==mChats.size()-1){
返回视图\类型\消息\我\角落;
}
if(chat.getUser().equals(mChats.get(position+1.getUser())){
返回视图\类型\消息\我;
}否则{
返回视图\类型\消息\我\角落;
}
}否则{
if(position==mChats.size()-1){
返回视图\类型\消息\窗口\角落;
}
if(chat.getUser().equals(mChats.get(position+1.getUser())){
返回视图\u类型\u消息\u BF;
}否则{
返回视图\类型\消息\窗口\角落;
}
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图;
if(viewType==视图\类型\消息\我| \视图类型==视图\类型\消息\我|角){
视图=最小充气器。充气(R.layout.recyclerview\u item\u right,parent,false);
返回新的MeMessageHolder(视图);
}else if(viewType==视图\类型\消息\ BF \视图类型==视图\类型\消息\ BF \角){
视图=最小充气器。充气(R.layout.recyclerview\u item\u left,父项,false);
返回新的BfMessageHolder(视图);
}
返回null;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
if(mChats!=null){
聊天当前=mChats.get(位置);
long unixTime=current.getUnixTime();
Date time=new java.util.Date(unixTime*1000L);
SimpleDataFormat sdf=新java.text.SimpleDataFormat(“h:mm a”);
字符串formattedTime=sdf.format(时间);
开关(holder.getItemViewType()){
案例视图\类型\消息\我:
((MeMessageHolder)holder).bind(当前,格式化时间,false);
打破
案例视图\类型\消息\我\角落:
((MeMessageHolder)holder).bind(当前,格式化时间,true);
打破
案例视图\u类型\u消息\u BF:
((BfMessageHolder)holder).bind(当前,格式化时间,false);
打破
案例视图\u类型\u消息\u BF\u角落:
((BfMessageHolder)holder).bind(当前,格式化时间,true);
打破
}
}
}
类MeMessageHolder扩展了RecyclerView.ViewHolder{
私有最终文本视图chatItemView;
私有最终图像视图cornerRightIImageView;
私有最终约束约束约束约束约束约束约束;
私有最终文本视图时间项视图;
私有MeMessageHolder(视图项视图){
超级(项目视图);
chatItemView=itemView.findViewById(R.id.textView);
cornerRightIImageView=itemView.findViewById(R.id.corner\u view\u right);
constraintLayout=itemView.findviewbyd(R.id.chat\u bubble\u id);
timeItemView=itemView.findViewById(R.id.text\u message\u time);
}
无效绑定(聊天聊天、字符串格式化时间、布尔值isCorner){
chatItemView.setText(chat.getMessage());
timeItemView.setText(格式化时间);
if(isCorner){
constraintLayout.setBackgroundResource(R.drawable.chat\u bubble\u v2);
}否则{
CornerRightIIImageView.setVisibility(视图.不可见);
}
}
}
类BfMessageHolder扩展了RecyclerView.ViewHolder{
私有最终文本视图chatItemView;
私有最终图像视图左图像视图;
私有最终约束约束约束约束约束约束约束;
私有最终文本视图时间项视图;
私人BfMessageHolder(查看项目视图){
超级(项目视图);
chatItemView=itemView.findViewById(R.id.textView);
cornerLeftImageView=itemView.findViewById(R.id.corner\u view\u left);
constraintLayout=itemView.findviewbyd(R.id.chat\u bubble\u id);
timeItemView=itemView.findViewById(R.id.text\u message\u time);
}
无效绑定(聊天聊天、字符串格式化时间、布尔值isCorner){
chatItemView.setText(chat.getMessage());
timeItemView.setText(格式化时间);
if(isCorner){
constraintLayout.setBackgroundResource(R.drawable.chat\u bubble\u v3);
}否则{
cornerLeftImageView.setVisibility(视图.不可见);
}
}
}
无效设置聊天(列表聊天){
mChats=聊天;
notifyDataSetChanged();
}
@凌驾
public int getItemCount(){
if(mChats!=null)
返回mChats.size();
否则返回0;
}
}
这个方法正确吗?我在上的中格式化了日期
java.util.Date dateTime=new java.util.Date((long)timeStamp*1000);
final long unixTime = 1372339860;
final String formattedDtm = Instant.ofEpochSecond(unixTime)
.atZone(ZoneId.of("GMT-4"))
.format(formatter);
System.out.println(formattedDtm); // => '2013-06-27 09:31:00'
public class SampleAdapter extends RecyclerView.Adapter<SampleAdapter.ViewHolder> {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.sample_view, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.bind(i);
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
void bind(int position) {
// Do your data updates here.
}
}
}
class Chat {
private Long unixTime;
// another code
public Long getUnixTime() {
return unixTime;
}
public String convertedUnixTimeToString(String format) {
// Also need to add some format validation
if(format == null) {
// do some action, like trowing exception, or setting default value in format
}
Date time = new java.util.Date(unixTime*1000L);
SimpleDateFormat sdf = new java.text.SimpleDateFormat(format);
return sdf.format(time);
}
}
public class ChatListAdapter extends RecyclerView.Adapter {
private final LayoutInflater mInflater;
private List<Chat> mChats;
private final String ownerMe = "OWNER_ME";
private static final int VIEW_TYPE_MESSAGE_ME = 1;
private static final int VIEW_TYPE_MESSAGE_ME_CORNER = 2;
private static final int VIEW_TYPE_MESSAGE_BF = 3;
private static final int VIEW_TYPE_MESSAGE_BF_CORNER = 4;
ChatListAdapter(Context context) {mInflater = LayoutInflater.from(context);}
@Override
public int getItemViewType(int position) {
Chat chat = mChats.get(position);
if(chat.getUser().equals(ownerMe)) {
if(position == mChats.size()-1) {
return VIEW_TYPE_MESSAGE_ME_CORNER;
}
if(chat.getUser().equals(mChats.get(position+1).getUser())) {
return VIEW_TYPE_MESSAGE_ME;
} else {
return VIEW_TYPE_MESSAGE_ME_CORNER;
}
} else {
if(position == mChats.size()-1) {
return VIEW_TYPE_MESSAGE_BF_CORNER;
}
if(chat.getUser().equals(mChats.get(position+1).getUser())) {
return VIEW_TYPE_MESSAGE_BF;
} else {
return VIEW_TYPE_MESSAGE_BF_CORNER;
}
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if(viewType == VIEW_TYPE_MESSAGE_ME || viewType == VIEW_TYPE_MESSAGE_ME_CORNER) {
view = mInflater.inflate(R.layout.recyclerview_item_right, parent, false);
return new MeMessageHolder(view);
} else if (viewType == VIEW_TYPE_MESSAGE_BF || viewType == VIEW_TYPE_MESSAGE_BF_CORNER) {
view = mInflater.inflate(R.layout.recyclerview_item_left, parent, false);
return new BfMessageHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (mChats != null) {
Chat current = mChats.get(position);
switch (holder.getItemViewType()) {
case VIEW_TYPE_MESSAGE_ME:
((MeMessageHolder) holder).bind(current, false);
break;
case VIEW_TYPE_MESSAGE_ME_CORNER:
((MeMessageHolder) holder).bind(current, true);
break;
case VIEW_TYPE_MESSAGE_BF:
((BfMessageHolder) holder).bind(current, false);
break;
case VIEW_TYPE_MESSAGE_BF_CORNER:
((BfMessageHolder) holder).bind(current, true);
break;
}
}
}
class MeMessageHolder extends RecyclerView.ViewHolder {
private final TextView chatItemView;
private final ImageView cornerRightIImageView;
private final ConstraintLayout constraintLayout;
private final TextView timeItemView;
private MeMessageHolder(View itemView) {
super(itemView);
chatItemView = itemView.findViewById(R.id.textView);
cornerRightIImageView = itemView.findViewById(R.id.corner_view_right);
constraintLayout = itemView.findViewById(R.id.chat_bubble_id);
timeItemView = itemView.findViewById(R.id.text_message_time);
}
void bind(Chat chat, boolean isCorner) {
chatItemView.setText(chat.getMessage());
timeItemView.setText(chat.convertedUnixTimeToString("h:mm a"));
if(isCorner) {
constraintLayout.setBackgroundResource(R.drawable.chat_bubble_v2);
} else {
cornerRightIImageView.setVisibility(View.INVISIBLE);
}
}
}
class BfMessageHolder extends RecyclerView.ViewHolder {
private final TextView chatItemView;
private final ImageView cornerLeftImageView;
private final ConstraintLayout constraintLayout;
private final TextView timeItemView;
private BfMessageHolder(View itemView) {
super(itemView);
chatItemView = itemView.findViewById(R.id.textView);
cornerLeftImageView = itemView.findViewById(R.id.corner_view_left);
constraintLayout = itemView.findViewById(R.id.chat_bubble_id);
timeItemView = itemView.findViewById(R.id.text_message_time);
}
void bind(Chat chat, boolean isCorner) {
chatItemView.setText(chat.getMessage());
timeItemView.setText(chat.convertedUnixTimeToString("h:mm a"));
if(isCorner) {
constraintLayout.setBackgroundResource(R.drawable.chat_bubble_v3);
} else {
cornerLeftImageView.setVisibility(View.INVISIBLE);
}
}
}
void setChats(List<Chat> chats) {
mChats = chats;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if(mChats!=null)
return mChats.size();
else return 0;
}
}