2016-09-25 1 views
0

Ich weiß, dass es ähnliche Fragen gibt, aber ich konnte nicht wirklich verstehen, also entschied ich mich, noch einmal zu fragen.2 verschiedene Layouts für den Typ jeder Reihe

Ich versuche etwas zu tun, das einem Chat ähnlich ist, also würde es in der Listenansicht zwei Arten von Zeilen geben, die der empfangenen und der gesendeten Elemente. Die empfangenen Pakete werden das recvRow.xml-Layout aufblasen, und die gesendeten werden das sentRow.xml-Layout aufblasen.

Ich habe eine Liste von Elementen, die angezeigt werden sollen (Name, img, etc) und ich habe einen Boolean, der darstellt, ob das Objekt gesendet oder empfangen wurde.

Das Problem ist, dass diese Layouts verschiedene Tasten haben und wenn ich zum Beispiel etwas zuerst erhalte, wird es natürlich die recvRow.xml laden, aber wenn ich dann versuche, etwas zu senden, wird es eine Nullpointerexzeption werfen, weil auf einem der Schaltflächen, die nur im Layout sentRow.xml vorhanden sind (und nicht in der Datei recvRow.xml vorhanden sind).

Da ich diesen boolean prüfe, dass ich Ihnen vorher sagte, sehe ich nicht die Notwendigkeit, die getItemViewType Methode zu verwenden.

Hier ist mein Code für die getView Methode:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    viewHolder = null; 
    if (convertView == null) { 

     viewHolder=new ViewHolder(); 
     LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     System.out.println("Transf Rec Adapter : Going to draw AN ITEM : "+ listOfItems.get(position).getAppName()); 
     System.out.println("Transf Rec Adapter : The received bool is : "+ listOfItems.get(position).isReceived()); 

     if(listOfItems.get(position).isReceived()){ 

      view=layoutInflater.inflate(R.layout.highway_transf_record_recv_row,parent,false); 
    viewHolder.deleteFile=(ImageView) view.findViewById(R.id.transfRecRowDelete); 
    viewHolder.installButton = (ImageView) view.findViewById(R.id.transfRecRowInstall); 

     }else{//se enviado 
      view=layoutInflater.inflate(R.layout.highway_transf_record_sent_row,parent,false); 

     viewHolder.reSendButton=(ImageView) view.findViewById(R.id.transfRecReSendButton); 

     } 
     viewHolder.appImageIcon=(ImageView) view.findViewById(R.id.transfRecRowImage); 
     viewHolder.appNameLabel=(TextView) view.findViewById(R.id.transfRecRowText); 
     viewHolder.appVersionLabel = (TextView) view.findViewById(R.id.transfRecRowAppVersion); 
     viewHolder.senderInfo = (TextView) view.findViewById(R.id.apkOrigin); 
     viewHolder.rowImageLayout = (RelativeLayout) view.findViewById(R.id.transfRecRowImageLayout); 
     viewHolder.appInfoLayout = (RelativeLayout) view.findViewById(R.id.appInfoLayout); 


    }else{ 
     view= convertView; 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 



    if(listOfItems.get(position).isReceived()){ 
     System.out.println("INSIDE THE GET VIEW TRANSF REC ADAPTER : RECEIVED SOMETHING"); 
     viewHolder.senderInfo.setText("You received this app :"); 


     myOnClickListenerToInstall = new MyOnClickListenerToInstall(position); 
     viewHolder.installButton.setOnClickListener(myOnClickListenerToInstall); 

     myOnClickListenerToDelete= new MyOnClickListenerToDelete(position); 
     viewHolder.deleteFile.setOnClickListener(myOnClickListenerToDelete); 

    }else{ 
     System.out.println("INSIDE THE GET VIEW TRANSF REC ADAPTER : SENT SOMETHING"); 
     viewHolder.senderInfo.setText("You sent this app :"); 
     ReSendListener reSendListener=new ReSendListener(position); 

     viewHolder.reSendButton.setOnClickListener(reSendListener);//null pointer exception here 

    } 
    viewHolder.appNameLabel.setText(listOfItems.get(position).getAppName()); 
    viewHolder.appImageIcon.setImageDrawable(listOfItems.get(position).getIcon()); 
    viewHolder.appVersionLabel.setText(listOfItems.get(position).getVersionName()); 

    view.setTag(viewHolder); 

    return view; 
} 

Die IDs sind richtig und alles existiert auf dem viewHolder.

Antwort

2

Sie müssen getItemViewType wegen Recycling verwenden. Andernfalls können Sie versuchen, ein empfangenes Element in eine nicht empfangene Ansicht zu recyceln, wodurch die Dinge königlich vermasselt werden. Es ist jedoch in Ordnung, wenn getItemViewType basierend auf diesem booleschen Wert nur 0 oder 1 zurückgibt. Für 2 Ansichtstypen muss es nicht sehr kompliziert sein.

1

Sie sollten getItemViewType() in Ihrem Adapter überschreiben. Diese Methode zeigt die Art der Ansicht an, die für jede Zeile aufgebläht werden sollte. Sie müssen auch getViewTypeCount() überschreiben.

Verwandte Themen