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.