2016-09-25 11 views
0

私は同様の質問があることを知っていますが、私は理解できませんでしたので、もう一度尋ねることにしました。各行のタイプに2種類のレイアウトがあります

私はチャットに似たことをしようとしています。リストビューでは、受信したアイテムと送信アイテムの2種類の行があります。受け取ったものはrecvRow.xmlレイアウトを膨らませ、送信されたものはsentRow.xmlレイアウトを膨らませます。

私は表示されるようにしなければならないアイテムのリスト(name、img、etc)を持っています。オブジェクトが送受信されたかどうかを表すブール値を持っています。

問題は、これらのレイアウトには異なるボタンがあり、たとえば最初に何かを受け取った場合、明らかにrecvRow.xmlがロードされますが、何かを送信しようとすると、nullpointerexceptionがスローされます。 sentRow.xmlレイアウトにのみ存在する(recvRow.xmlには存在しない)ボタン。

私があなたに言ったブール値をチェックしているので、getItemViewTypeメソッドを使用する必要はありません。ここで

はGetViewメソッドのために私のコードです:

@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; 
} 

IDが正しいとすべてがviewHolder上に存在します。

答えて

2

リサイクルのためにgetItemViewTypeを使用する必要があります。それ以外の場合は、受け取ったアイテムを受信して​​いないビューにリサイクルすることができます。しかし、getItemViewTypeは、そのブール値に基づいて0または1を返すだけでOKです。 2つのビュータイプではそれほど複雑である必要はありません。

1

アダプタでgetItemViewType()を無効にする必要があります。このメソッドは、各行に対して膨らませるべきビューのタイプを示します。また、getViewTypeCount()を上書きする必要があります。

関連する問題