在两种不同的情况下使用适配器

时间:2017-02-19 00:59:03

标签: 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();
    }

}

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

除此之外,我在我的应用的不同部分使用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),以便我不必重复任何代码。

1 个答案:

答案 0 :(得分:1)

创建一个包含所有共享逻辑的第三个类,并将适配器delegate添加到其中。

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