gpt4 book ai didi

java - 使用适配器应对两种不同情况

转载 作者:行者123 更新时间:2023-12-01 08:52:08 25 4
gpt4 key购买 nike

我有一个常规的 RecyclerView 适配器,如下所示:

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {

private static final String TAG = "MessageAdapter";

private Context context;

private List<Message> messages;

public MessageAdapter(Context context, List<Message> messages) {
this.context = context;
this.messages = messages;
}

public class ViewHolder extends RecyclerView.ViewHolder {
public Message message;

public TextView messageUser, messageText, messageTime;

public ViewHolder(View v) {
super(v);

messageUser = (TextView) v.findViewById(R.id.messageUser);
messageText = (TextView) v.findViewById(R.id.messageText);
messageTime = (TextView) v.findViewById(R.id.messageTime);
}

public void setMessage(Message message) {
this.message = message;
}
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);

View view = inflater.inflate(R.layout.message_layout, parent, false);

ViewHolder viewHolder = new ViewHolder(view);

return viewHolder;
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
Message message = messages.get(position);

holder.setMessage(message);

holder.messageUser.setText(message.getUser());
holder.messageText.setText(message.getText());
holder.messageTime.setText(message.getTime());
}

@Override
public int getItemCount() {
return messages.size();
}

}

我使用此适配器列出用户在主 Activity 中收到的所有消息。

除此之外,我还使用 AndroidTreeView library在我的应用程序的另一个部分中,也显示用户的消息(但在 TreeView 布局中)。

但是,阅读该库的文档时,它说为了为 TreeView 数据创建适配器,它必须具有以下格式(取自文档):

public class MyHolder extends TreeNode.BaseNodeViewHolder<IconTreeItem> {
...
@Override
public View createNodeView(TreeNode node, IconTreeItem value) {
final LayoutInflater inflater = LayoutInflater.from(context);
final View view = inflater.inflate(R.layout.layout_profile_node, null, false);
TextView tvValue = (TextView) view.findViewById(R.id.node_value);
tvValue.setText(value.text);

return view;
}
...
public static class IconTreeItem {
public int icon;
public String text;
}
}

因此,我创建了第二个消息适配器(专门用于 AndroidTreeView 库),如下所示:

public class MessageTreeAdapter extends TreeNode.BaseNodeViewHolder<MessageTreeAdapter.TreeItem> {

private TextView messageUser;
private TextView messageText;
private TextView messageTime;

public MessageTreeAdapter(Context context) {
super(context);
}

@Override
public View createNodeView(TreeNode node, TreeItem value) {
final LayoutInflater inflater = LayoutInflater.from(context);
final View view = inflater.inflate(R.layout.message_layout, null, false);

Message message = value.message;

messageUser = (TextView) v.findViewById(R.id.messageUser);
messageText = (TextView) v.findViewById(R.id.messageText);
messageTime = (TextView) v.findViewById(R.id.messageTime);

messageUser.setText(message.getUser());
messageText.setText(message.getText());
messageTime.setText(message.getTime());

return view;
}

public static class TreeItem {
public Message message;

public TreeItem(Message message) {
this.message = message;
}
}
}

但正如您所看到的,我正在重复我的第一个适配器 MessageAdapter.java 中已有的内容。我想避免这种情况。

所以我的问题是,如何在这两种情况下使用单个适配器 (MessageAdapter.java),这样我就不必重复任何代码。

最佳答案

创建第三个类,其中包含所有共享逻辑并具有适配器 delegate到它。

就我个人而言,我通常在使用适配器时创建自定义 View 类,其中包含所有与 View 相关的代码。保持适配器简单,并且可以轻松地在不同上下文中重用 View (例如本例中的不同列表/适配器)

关于java - 使用适配器应对两种不同情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42322467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com