2017-04-05 6 views
1

Ich versuche, eine RecyclerView mit zwei verschiedenen Layouts zu implementieren. In der MainActivity ich zuerst erstellen ListItem Objekt und fügen Sie es der Liste hinzu und fügen Sie das dann dem Adapter hinzu, aber es wird nicht angezeigt. Und ich rufe auch eine Methode, die ListItem Objekt erstellt und fügt es der Liste hinzu und benachrichtigt dann den Adapter, aber es wird weiterhin nicht angezeigt. Hier ist mein Code so weit:Android RecyclerView mit verschiedenen Layouts funktioniert nicht

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="nl.iansoft.www.recyclerviewproblem.MainActivity"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rvList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginBottom="100dp" 
     /> 

</android.support.constraint.ConstraintLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private ArrayList<ListItem> listItems; 
    private CustomAdapter customAdapter; 
    private RecyclerView rvList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     rvList = (RecyclerView)findViewById(R.id.rvList); 
     listItems = new ArrayList<>(); 
     ListItem listItem = new ListItem("MyName", "MyLatsName", "MyEmail"); 
     listItems.add(listItem); 
     customAdapter = new CustomAdapter(listItems); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); 
     rvList.setLayoutManager(mLayoutManager); 
     rvList.setItemAnimator(new DefaultItemAnimator()); 
     rvList.setAdapter(customAdapter); 

     addItemToTheList(); 
    } 

    private void addItemToTheList(){ 
     ListItem listItem = new ListItem("MyName", "MyLatsName", "MyEmail"); 
     listItems.add(listItem); 
     customAdapter.notifyDataSetChanged(); 
    } 
} 

CustomAdapter.java

public class CustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private ArrayList<ListItem> listItems; 

    public class ListItem1ViewHolder extends RecyclerView.ViewHolder { 
     public TextView tvName; 
     public TextView tvLastName; 
     public TextView tvEmail; 

     public ListItem1ViewHolder(View view) { 
      super(view); 
      tvName = (TextView) view.findViewById(R.id.tvName); 
      tvLastName = (TextView) view.findViewById(R.id.tvLastName); 
      tvEmail = (TextView) view.findViewById(R.id.tvEmail); 
     } 
    } 

    public class ListItem2ViewHolder extends RecyclerView.ViewHolder { 

     public TextView tvName2; 
     public TextView tvLastName2; 
     public TextView tvEmail2; 

     public ListItem2ViewHolder(View view) { 
      super(view); 

      tvName2 = (TextView) view.findViewById(R.id.tvName2); 
      tvLastName2 = (TextView) view.findViewById(R.id.tvLastName2); 
      tvEmail2 = (TextView) view.findViewById(R.id.tvEmail2); 
     } 
    } 


    public CustomAdapter(ArrayList<ListItem> listItems) { 
     this.listItems = listItems; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView; 
     if(viewType == 1){ 
      itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.my_list_item, parent, false); 
      return new CustomAdapter.ListItem1ViewHolder(itemView); 
     }else{ 
      itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.my_list_item2, parent, false); 
      return new CustomAdapter.ListItem2ViewHolder(itemView); 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if(listItems.get(position).getName().equals("MyName")){ 
      return 1; 
     }else{ 
      return 2; 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ListItem listItem = listItems.get(position); 
     if(holder.getItemViewType() == 1) { 
      ListItem1ViewHolder listItem1ViewHolder = (ListItem1ViewHolder) holder; 
      listItem1ViewHolder.tvName.setText(listItem.getName()); 
      listItem1ViewHolder.tvLastName.setText(listItem.getLastName()); 
      listItem1ViewHolder.tvEmail.setText(listItem.getEmail()); 
     }else{ 
      ListItem2ViewHolder listItem2ViewHolder = (ListItem2ViewHolder)holder; 
      listItem2ViewHolder.tvName2.setText(listItem.getName()); 
      listItem2ViewHolder.tvLastName2.setText(listItem.getLastName()); 
      listItem2ViewHolder.tvEmail2.setText(listItem.getEmail()); 
     } 
    } 

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

ListItem.java

public class ListItem { 

    private String name; 
    private String lastName; 
    private String email; 

    public ListItem() { 
    } 

    public ListItem(String name, String lastName, String email) { 
     this.name = name; 
     this.lastName = lastName; 
     this.email = email; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

my_list_item2.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/tvName2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14sp" 
     android:text="Name2" 
     android:layout_marginTop="15dp" 
     android:padding="5dp"/> 

    <TextView 
     android:id="@+id/tvLastName2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="16sp" 
     android:text="Last Name2" 
     android:layout_below="@+id/tvName2" 
     android:layout_marginTop="10dp" 
     android:padding="5dp" /> 

    <TextView 
     android:id="@+id/tvEmail2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14sp" 
     android:text="[email protected]" 
     android:layout_below="@+id/tvLastName2" 
     android:layout_marginTop="5dp" 
     android:padding="5dp" /> 

</RelativeLayout> 

my_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/tvName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14sp" 
     android:text="Name" 
     android:layout_marginTop="15dp" 
     android:padding="5dp"/> 

    <TextView 
     android:id="@+id/tvLastName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="16sp" 
     android:text="Last Name" 
     android:layout_below="@+id/tvName" 
     android:layout_marginTop="10dp" 
     android:padding="5dp" /> 

    <TextView 
     android:id="@+id/tvEmail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14sp" 
     android:text="[email protected]" 
     android:layout_below="@+id/tvLastName" 
     android:layout_marginTop="5dp" 
     android:padding="5dp" /> 

</RelativeLayout> 
+0

Können Sie 'activity_main' posten? – azizbekian

+0

@azizbekian Gerade hinzugefügt. – Nikolaj

+1

Können Sie 'ConstraintLayout' beispielsweise in' FrameLayout' ändern? – azizbekian

Antwort

1

Das Problem ist in ConstraintLayout. Weil Sie keine Einschränkungen für Ihre RecyclerView angegeben haben.

Entweder Vorgaben angeben oder in ein anderes Layout verschieben (z. B. FrameLayout).

Aber speziell in diesem Fall brauchen Sie nicht übergeordnete Layout, weil es nutzlos ist, solange Sie nur RecyclerView in Ihrer Ansicht Hierarchie haben.

Verwandte Themen