我有一个常规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();
}
}
我使用此适配器列出用户在主要活动中收到的所有消息。
除此之外,我在我的应用的不同部分使用AndroidTreeView library,该部分还显示用户的消息(但在树视图布局中)。
但是,阅读这个库的文档,它说为了为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
),以便我不必重复任何代码。
答案 0 :(得分:1)
创建一个包含所有共享逻辑的第三个类,并将适配器delegate添加到其中。
就个人而言,我通常在使用适配器时创建自定义视图类,其中包含所有与视图相关的代码。保持适配器简单,并且可以轻松地在不同的上下文中重用视图(例如在不同的上下文/适配器中)