1

Ich habe eine benutzerdefinierte Ansicht, die ich in zwei verschiedenen Adaptern verwenden kann.Verwenden einer benutzerdefinierten Ansicht in mehreren Adaptern

Hier ist das Layout der benutzerdefinierten Ansicht (custom_view.xml):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/container"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_height="100dp" 
     android:layout_width="100dp" /> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 

Hier ist die Klasse der benutzerdefinierten Ansicht (CustomView.java):

public class CustomView extends RelativeLayout { 
    private final String TAG = "CustomView"; 

    private User user; 

    private RelativeLayout container; 
    private ImageView imageView; 
    private TextView textView; 

    public CustomView(Context context) { 
     super(context); 
     init(); 
    } 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public CustomView(Context context, AttributeSet attrs, User user) { 
     super(context, attrs); 
     this.user = user; 
     init(); 
    } 

    public CustomView(Context context, User user) { 
     super(context); 
     this.user = user; 
     init(); 
    } 

    private void init() { 
     inflate(getContext(), R.layout.custom_view, this); 

     container = (RelativeLayout) findViewById(R.id.container); 
     avatar = (ImageView) findViewById(R.id.imaveView); 
     displayName = (TextView) findViewById(R.id.textView); 

     // Add the user profile picture to the imageView 
     Glide.with(getContext()) 
       .load("http://www.website.com/img/users/" + user.getId() + "/avatar.png") 
       .into(imageView); 

     // Set the user username in the textView 
     textView.setText(user.getUsername()); 
    } 
} 

Nun, ich brauche die benutzerdefinierte Ansicht in zwei verschiedenen verwenden Adapter.

Die erste Adapter Ich brauche die benutzerdefinierte Ansicht zu verwenden, in einem regulären RecyclerView Adapter ist, die wie folgt aussieht derzeit:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { 
    private static final String TAG = "CustomAdapter"; 

    private Context context; 

    private List<User> userData; 

    public CustomAdapter(Context context, List<User> userData) { 
     this.context = context; 
     this.userData = userData; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public ViewHolder(View v) { 
      super(v); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // TODO: WHAT DO I PUT HERE? 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     // TODO: WHAT DO I PUT HERE? 
    } 

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

Wie kann ich die benutzerdefinierte Ansicht in dieser Klasse aufblasen und wie kann ich die binden userData dazu?

Der zweite Adapter, den ich verwenden muss, ist ein Adapter für die AndroidTreeView library.

Hier ist mein Adapter (bisher) für die AndroidTreeView Bibliothek:

public class CustomTreeAdapter extends TreeNode.BaseNodeViewHolder<CustomTreeAdapter.TreeItem> { 
    public CustomTreeAdapter(Context context) { 
     super(context); 
    } 

    @Override 
    public View createNodeView(TreeNode node, TreeItem value) { 
     // TODO: WHAT DO I PUT HERE? 
    } 

    public static class TreeItem { 
     // TODO: WHAT DO I PUT HERE? 
    } 
} 

Als Referenz ist hier der integration documentation für die AndroidTreeView Bibliothek.

Was sollte ich in die obigen Methoden eingeben?

Danke.

Antwort

1

Für RecyclerView, in Ihrem onCreateViewHolder() Ich würde dies setzen:

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_view, parent, false); 
    return new CustomViewHolder(view); 
} 

Und dann, zu binden, Daten von Userdata auf Ihre ViewHolder, setzen diese für onBindViewHolder():

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    holder.textView.setText(userData.get(position).getName()); 
} 

natürlich bedeutet dies, Sie das Textview in Ihrem ViewHolder ersten finden haben müssen:

class CustomViewHolder extends RecyclerView.ViewHolder { 
    TextView textView; 

    CustomViewHolder(View v) { 
     super(v); 
     textView = (TextView) v.findViewById(R.id.textView); 
    } 
} 

bei l Ost Ich denke, das ist, wie Sie es mit dem RecyclerView und ViewHolder tun würden, ich denke, dass Sie Ihren Code in CustomView-Klasse wie init() in ViewHolder vielleicht verschieben möchten.

+0

Ich habe bereits meinen gesamten Textansichtstext in der benutzerdefinierten Ansichtsklasse eingestellt, daher macht es keinen Sinn, 'setText()' erneut im ViewHolder zu machen. – l890456

+0

Aber ich dachte, ViewHolder ist, wo Sie die Ansichten für Ihr Element/Zeile festlegen sollen? –

+0

Doet 'setText()' zweimal, einmal in jedem Adapter, macht keinen Sinn, wenn ich es einmal in der benutzerdefinierten Ansicht Klasse tun kann. – l890456

Verwandte Themen