34 votes

Adaptateur AndroidView?

Les Documents de dire:

Lorsque le contenu de votre mise en page est dynamique ou pas pré-déterminé, vous pouvez utiliser une mise en page qui sous-classes AdapterView pour remplir la mise en page avec des vues au moment de l'exécution. Une sous-classe de l'AdapterView classe utilise un Adaptateur pour lier les données à sa disposition.

Mais la plupart des tutoriels à propos de ListView,GridView,Spinner et Gallery.

Je suis à la recherche de prolonger une sous-classe directement à partir de AdapterView. J'ai créer un affichage personnalisé que son contenu est tributaire d'un adaptateur.

Comment puis-je faire cela, et quelles méthodes doit être remplacée?

24voto

Leonidos Points 6450

Tout d'abord, vous devez être absolument sûr que AdapterView est ce que vous voulez, parce que pas tous les "dynamique ou pas pré-déterminé" points de vue peut être mettre en œuvre via AdapterView. Parfois, vous feriez mieux de créer votre vue s'étendant ViewGroup.

si vous souhaitez utiliser AdapterView, jetez un oeil à cette très belle exemple. Il y a beaucoup de vues personnalisées avec adaptateur sur GitHub. Découvrez celui-ci (s'étend ViewGroup).

6voto

Nezam Points 2627

Ce n'est peut-être pas une réponse totale à votre question mais je vous montre très probablement un point de départ ou un pointeur qui peut vous guider:

Tutoriels pour développeurs Sony - 3D ListView

5voto

Ridcully Points 8353

ListView s'étend AbsListView qui s'étend AdapterView<ListAdapter>. Donc, si vous devez absolument mettre en œuvre un tel affichage personnalisé à partir de zéro, vous pourriez avoir un coup d'oeil au code source de ces classes:

Mais attention, c'est tout à fait une tâche. Peut-être il peut être suffisant d'utiliser l'une des classes existantes et de modifier le look.

2voto

Découlant de l'AdapterView peut fonctionner, mais il peut ne pas être aussi bénéfique que vous l'espérez. Une partie de l'infrastructure fournie par AdapterView est colis-privé, ce qui signifie que nous n'avez pas accès à elle.

Par exemple, AdapterView gère l'index de l'élément sélectionné pour AbsListView et ListView. Cependant, parce que les méthodes comme "setNextSelectedPositionInt(int position)" (qui est le seul chemin d'accès à la configuration de mNextSelectedPosition) sont forfait-privé, nous ne peuvent pas les atteindre. AbsListView et ListView pouvez obtenir pour eux parce qu'ils sont dans le même paquet, mais nous ne pouvons pas.

(Si vous creusez dans l'AdapterView source, vous verrez que setNextSelectedPositionInt() est appelée à partir de handleDataChanged(). Malheureusement handleDataChanged() est également forfait-privée et n'est pas appelée à partir de n'importe où ailleurs dans AdapterView qui pourraient être mis à profit pour permettre la position de réglage.)

Cela signifie que si vous avez besoin de gérer la position sélectionnée, vous aurez besoin de recréer l'infrastructure de votre classe dérivée (ou vous aurez besoin de tirer à partir de ListView ou AbsListView...bien que je soupçonne que vous pourrez rencontrer des problèmes similaires découlant de AbsListView). Cela signifie également que toute AdapterView fonctionnalité qui tourne autour de la sélection de l'élément ne sera pas pleinement opérationnel.

-2voto

lokoko Points 2496

Vous pouvez créer quelque chose comme ceci:

 public class SampleAdapter extends BaseAdapter {

public SampleAdapter() {
  // Some constructor
}

public int getCount() {
  return count; // Could also be a constant. This indicates the # of times the getView gets invoked.
}

public Object getItem(int position) {
    return position; // Returns the position of the current item in the iteration
}

public long getItemId(int position) {
  return GridView.INVALID_ROW_ID;
}

public View getView(int position, View convertView, ViewGroup parent) {
  View view = null;

  view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.some_layout, null);
  view.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.setBackgroungColor(Color.RED);

  return view;
}
 

}

Et cela pourrait être invoqué comme:

 GridView sampleView = (GridView) linearLayout.findViewById(R.id.sample_layout);
sampleView.setAdapter(new SampleAdapter());
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X