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

标签 java android android-layout treeview android-adapter

我有一个常规的 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/

相关文章:

java - 从内部类访问扩展类的方法

java - Maven 依赖项 jar 未更新或在 Eclipse 中出错

java - 相当于Android中的javax.swing.Timer

android - 使用 Volley 和 OkHttp 时如何配置 Http 缓存?

android - 通过 ConstraintLayout 在两个维度上使用比率来显示 3 个相同大小的正方形

android - 将小部件添加到我自己的应用程序中。- Android

java - XOR (^) 交换算法如何工作?

java - C2DM寄存器频率

android - 如何读取 WhatsApp 媒体路径

android - 使用线性布局在真实设备上未显示图像