Implémentation de plusieurs mises en page de ListView Item
Introduction à cette section :
Cette section est la dernière section de la section ListView. Elle vous apporte l'implémentation de l'élément multi-mise en page ListView. Qu'est-ce que la disposition multiple d'éléments ListView ? Par exemple, une liste de discussion QQ :
Si elle est créée avec un ListView, alors il existe deux types d'éléments ListView différents ! Une à gauche et une à droite, hé, cette section vous apprendra comment implémenter plusieurs mises en page de ListView !
1. Points clés :
Réécrivez la méthode getItemViewType() pour correspondre à la catégorie dans laquelle se trouve la vue, et la méthode getViewTypeCount() renvoie Combien y a-t-il de catégories au total ! Appelez ensuite getItemViewType sur getView pour obtenir la catégorie correspondante, puis chargez la View correspondante !
2. Implémentation du code :
Ici, utilisez directement les deux mises en page de la section précédente, puis écrivez un autre adaptateur pour réécrire certains des points clés. . Plusieurs endroits :
MutiLayoutAdapter.java:
* Créé par Jay le 2015/9/23 0023.
*/
classe publique MutiLayoutAdapter étend BaseAdapter{
//定义两个类别标志
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private Context mContext;
private ArrayList<Object> mData = null;
public MutiLayoutAdapter(Context mContext,ArrayList<Object> mData) {
this.mContext = mContext;
this.mData = mData;
>
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem getItem(int position) {
>
@Override
public int getItemViewType(int position) {
if (mData.get(position) instanceof App) {
return TYPE_APP;
} else if (mData.get(position) instanceof Book) {
return TYPE_BOOK;
} else {
return super.getItemViewType(position);
}
}
//类别数目
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
if(convertView == null ){
switch (type){
case TYPE_APP:
holder1 = new ViewHolder1();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_one, parent, false) ;
holder1.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_a nom);
convertView.setTag( R.id.Tag_APP,holder1);
break;
case TYPE_BOOK:
holder2 = new ViewHolder2();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);
holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_bname);
holder2.txt_bauthor = (TextView) convertView.findViewById( R.id.txt_bauthor);
convertView.setTag(R.id.Tag_Book,holder2);
pause;
}
}autre{
commutateur (type){
case TYPE_APP:
holder1 = ( ViewHolder1) convertView.getTag(R.id.Tag_APP);
break ;
case TYPE_BOOK:
holder2 = (ViewHolder2) convertView.getTag(R.id.Tag_Book);
break;
}
}
Object obj = mData.get (position);
//设置下控件的值
commutateur (type){
case TYPE_APP:
App app = (App) obj;
if(app != null){
holder1.img_icon.setImageResource(app.getaIcon());
holder1.txt_aname.setText(app.getaName());
>
pause ;
case TYPE_BOOK :
Livre book = (Livre) obj;
if(livre != null){
holder2.txt_bname.setText(book.getbName());
holder2.txt_bauthor.setText(book.getbAuthor());
}
break ;
}
return convertView;
>
//Deux ViewHolder
classe statique privée ViewHolder1{
ImageView img_icon;
TextView txt_aname;
}
classe statique privée ViewHolder2 {
TextView txt_bname;
TextView txt_bauthor;
}
}
Il y a quelque chose à quoi il faut faire attention ici, convertView.setTag(R.id . Tag_APP,holder1); Nous avons généralement directement setTag(Object), c'est la méthode surchargée de setTag, les paramètres sont une clé unique et un objet après ! seulement! ! ! J'ai d'abord utilisé directement TYPE_BOOK comme premier paramètre, puis j'ai signalé l'erreur suivante :
La clé doit être un identifiant de ressource spécifique à l'applicationC'est-à-dire que la précédente doit être unique. Définir une variable finale de type int et coder en dur une valeur ne fonctionnera pas. L'approche ici consiste à ajouter directement dans strings.xml :
<item name="Tag_Book" type="id"></item>
Bien sûr, vous pouvez également créer un autre fichier ids.xml sous res/values/ et coller le code ci-dessus ! En plus de cela, il y a une autre chose à noter, c'est-à-dire que les signes qui distinguent les catégories doivent commencer à 0, sinon ce qui suit sera rapporté Erreur comme celle-ci
MainActivity.java :
private static final int TYPE_BOOK = 0;
private static final int TYPE_APP = 1;
private ListView list_content;
private ArrayList< Objet> mData = null;
private MutiLayoutAdapter myAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout .activity_main);
//数据准备:
mData = new ArrayList<Object>();
for(int i = 0;i < 20;i++){
changer ((int)(Math.random() * 2)){
case TYPE_BOOK:
mData.add(new Book("《第一行代码》","郭霖"));
case TYPE_APP:
mData.add(new App(R.mipmap.iv_icon_baidu,"百度"));
break;
}
}
list_content = (ListView) findViewById(R.id.list_content);
myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);
list_content.setAdapter(myAdapter);
}
}
Ce qui précède génère aléatoirement 0 et 1, 0 ajoute un objet Book à la collection et 1 ajoute un objet App !
3. Téléchargement du code :
ListViewDemo6.zip
Résumé de cette section :
D'accord, cette section Je vous ai expliqué l'implémentation de plusieurs mises en page de ListView Item, qui est la réécriture de deux méthodes. Ensuite, getView() porte un jugement et définit différentes mises en page~Le code est très simple~
Ceci conclut les connaissances sur ListView Bien sûr, les connaissances sur ListView ne se limitent pas à cela. Chargement asynchrone, optimisation, etc., nous apprendrons cela dans la partie avancée~ C'est tout, merci~