2017-10-04 5 views
0

Vous voulez faire une liste d'éléments, mais triés de manière différente, comme placé au hasard. Le nombre d'éléments sera modifié dynamiquement, relativement l'API. La chose est que, comment puis-je placer tous les éléments entrants de manière placés au hasard, exactement comme ceci: ImageSampleAndroid RecycleView avec des éléments placés au hasard

enter image description here

post-scriptum Il y aura 3 types de figures: Rectangle horizontal, Rectangle vertical et Carré.

Répondre

0

Faire motif support multiple de vue et sur la base de variables spécifiques gonflent la vue à l'intérieur de l'adaptateur. Comme vous avez 3 types de lignes différentes, vous devez créer 3 viewholders

+0

Je l'ai essayé, mais je ne sais pas comment placer les éléments avec un nombre aléatoire de colonnes – revcik

+0

Que voulez-vous dire par nombre aléatoire de colonnes? – YoLo

0

Vous devez le StaggeredGridLayout si vous ne savez pas Hoz à l'utiliser, suivez cet exemple: Example

+0

déjà essayé cela, car je sais qu'il a besoin d'engourdissements strictement spécifiés. – revcik

0
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.StaggeredGridLayoutManager; 
import java.util.ArrayList; 
import java.util.Arrays; 
public class MainActivity extends AppCompatActivity { 
    // ArrayList for person names 
    ArrayList personNames = new ArrayList<>(Arrays.asList("Person 1", "Person 2", "Person 3", "Person 4", "Person 5", "Person 6", "Person 7", "Person 8", "Person 9", "Person 10", "Person 11", "Person 12", "Person 13", "Person 14")); 
    ArrayList personImages = new ArrayList<>(Arrays.asList(R.drawable.person1, R.drawable.person2, R.drawable.person3, R.drawable.person4, R.drawable.person5, R.drawable.person6, R.drawable.person7, R.drawable.person1, R.drawable.person2, R.drawable.person3, R.drawable.person4, R.drawable.person5, R.drawable.person6, R.drawable.person7)); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // get the reference of RecyclerView 
     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     // set a StaggeredGridLayoutManager with 3 number of columns and vertical orientation 
     StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(staggeredGridLayoutManager); // set LayoutManager to RecyclerView 
     // call the constructor of CustomAdapter to send the reference and data to Adapter 
     CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, personNames, personImages); 
     recyclerView.setAdapter(customAdapter); // set the Adapter to RecyclerView 
    } 
} 

CustomAdapter.java

import android.content.Context; 
import android.content.Intent; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import java.util.ArrayList; 
public class CustomAdapter extends RecyclerView.Adapter { 
    ArrayList personNames; 
    ArrayList personImages; 
    Context context; 
    public CustomAdapter(Context context, ArrayList personNames, ArrayList personImages) { 
     this.context = context; 
     this.personNames = personNames; 
     this.personImages = personImages; 
    } 
    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // infalte the item Layout 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     MyViewHolder vh = new MyViewHolder(v); // pass the view to View Holder 
     return vh; 
    } 
    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     // set the data in items 
     holder.name.setText(personNames.get(position)); 
     holder.image.setImageResource(personImages.get(position)); 
     // implement setOnClickListener event on item view. 
     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // open another activity on item click 
       Intent intent = new Intent(context, SecondActivity.class); 
       intent.putExtra("image", personImages.get(position)); // put image data in Intent 
       context.startActivity(intent); // start Intent 
      } 
     }); 
    } 
    @Override 
    public int getItemCount() { 
     return personNames.size(); 
    } 
    public class MyViewHolder extends RecyclerView.ViewHolder { 
     // init the item view's 
     TextView name; 
     ImageView image; 
     public MyViewHolder(View itemView) { 
      super(itemView); 
      // get the reference of item view's 
      name = (TextView) itemView.findViewById(R.id.name); 
      image = (ImageView) itemView.findViewById(R.id.image); 
     } 
    } 
} 

res Open -> mise en page - > activity_main.xml (ou) main.xml et ajoutez le code suivant:

étape nous créons un RecyclerView dans notre fichier XML.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

Créez un nouveau fichier XML rowlayout.xml pour l'élément de grille de RecyclerView.

<?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" 
    android:background="@drawable/custom_item_layout" 
    android:padding="5dp"> 
    <!-- 
    grid items for RecyclerView 
    --> 
    <ImageView 
     android:id="@+id/image" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="fitXY" 
     android:src="@mipmap/ic_launcher" /> 
    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:text="ABCD" 
     android:textSize="20sp" 
     android:textColor="#fff" /> 
</RelativeLayout> 

enter image description here

+0

semble très bien, mais voici également 3 colonnes. dans ce cas, j'ai besoin de placer dans un nombre aléatoire de colonnes .. – revcik

+0

Cette disposition est une grille, avec une portée fixe. Cependant, nous pouvons avoir des éléments couvrant toute la ligne ou la colonne. Voyons voir comment ça fonctionne. En utilisant nos éléments actifs/inactifs plus tôt, nous allons étendre les éléments actifs. Ceci est fait dans l'adaptateur, lors de la liaison d'un élément. –

+0

// Span l'élément si actif final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); si (lp instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams sglp = (StaggeredGridLayoutManager.LayoutParams) lp; sglp.setFullSpan (item.isActive()); holder.itemView.setLayoutParams (sglp); } –