2017-02-19 6 views
0

У меня есть регулярный 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

woah, все шло хорошо, а затем взорвалось в беспорядок. Используя общепринятую стандартную практику чтения, держите адаптер для выполнения своих заданий и держателей. Другими словами, ваш код может быть перегруппирован для просмотра классов, а в java, интерфейсе и повторном использовании гораздо более практичным. просто много диссекции. – user7568042

ответ

1

Создайте третий класс, который содержит всю вашу общую логику и снабдит ваши адаптеры delegate.

Лично я обычно создаю пользовательские классы просмотра при использовании адаптеров, которые содержат весь код, связанный с просмотром. Сохраняет адаптеры просто и позволяет легко повторно использовать представление в разных контекстах (например, в разных случаях/разных адаптерах)

+0

Я не уверен, что понимаю. Можете ли вы привести пример того, как вы создаете пользовательские классы просмотра и используете их в нескольких адаптерах? – user7586924

+0

@ user7586924 вы можете начать с googgling «создать пользовательский вид» –

+0

Я создал пользовательские представления раньше, но я не понимаю, как я могу использовать это в моих интересах здесь. – user7586924

Смежные вопросы