2
votes

Android - GridLayoutManager - Charger les éléments de la liste verticalement?

J'ai une liste de disons 20 articles. Je veux pouvoir les charger comme ceci

1 2
3 4
5 6
7 8
....

J'utilise un RecyclerView avec un GridLayoutManager En utilisant GridLayoutManager (context, 2) , il charge les éléments comme suit

1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 20

Quelle n'est pas ma sortie souhaitée

p >


1 commentaires

Oui. vous ne pouvez pas faire ça. Vous devez organiser / affecter manuellement les éléments de la liste pour obtenir la sortie


3 Réponses :


0
votes

Le GridLayoutManager apprend toujours au RecyclerView à dessiner de gauche à droite et de haut en bas. L'échelle par défaut de la raison de cette vue est verticale (ou horizontale). Il ne peut pas calculer le nombre de lignes qu'il doit afficher dans ce cas dynamique. J'ai une solution pour toi. Cependant, vous ne devez pas conserver cette logique métier.

Tout ce dont vous avez besoin est un adaptateur avec deux types de vue et une logique simple pour indexer la bonne chose. Exemple de code:

public class SampleAdapter extends RecyclerView.Adapter<ViewHolder> {
    private final Context context;
    private List<Integer> listLeft;
    private List<Integer> listRight;

    public SampleAdapter (Context context) {
        this.context = context;
    }

    public void setListLeft(List<Integer> list) {
        this.listLeft = list;
    }

    public void setListRight(List<Integer> list) {
        this.listRight = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.sample, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        int index = position / 2; // assumes there are two lists of equal lengths
        int viewType = getItemViewType(position);
        if (viewType == TYPE_1) {
            holder.textView.setText(listLeft.get(index).toString());
        } else if (viewType == TYPE_2) {
            holder.textView.setText(listRight.get(index).toString());
        }
    }

    @Override
    public int getItemCount() {
        return listLeft.size() + listRight.size();
    }

    @Override
    public int getItemViewType(int position) {
        return position % 2 == 0 ? VIEW_TYPE_1 : VIEW_TYPE_2;
    }
}

Ordre des tirages


0 commentaires

0
votes

Vous pouvez implémenter une logique comme celle-ci. Cela fonctionnera parfaitement

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, pos: Int) {
            var arraySize = 21
            var half = 0
            if (array % 2 == 0)
                half = array % 2
            else half = (array % 2 + 0.5).toInt()
            if (pos  % 2 == 0)
                print(pos)
            else print(half + pos)
        }


0 commentaires

1
votes

Le moyen le plus simple d'y parvenir serait de trier la ArrayList en fonction de l'ordre requis, vous transmettez la fonction your arraylist à réorganiserTheArrayList , obtenez la nouvelle ArrayList et transmettez-la à l'adaptateur de vue recycleur pour obtenir les résultats mentionnés ci-dessus commande.

 public ArrayList<Integer> rearrangeTheArrayList(ArrayList<Integer> integerArrayList) {
    ArrayList<Integer> resultArrayList = new ArrayList<>();
    int halfLength = 0;
    if (integerArrayList.size() % 2 == 1) {
        halfLength = (integerArrayList.size() / 2) + 1;
    } else {
        halfLength = integerArrayList.size() / 2;
    }

    for (int i = 0; i < halfLength; i++) {
        resultArrayList.add(integerArrayList.get(i));
        if ( (i + halfLength)<(integerArrayList.size() )) {
            resultArrayList.add(integerArrayList.get(i + halfLength));
        }
    }
    return resultArrayList;
}


0 commentaires