簡體   English   中英

每行類型2種不同的布局

[英]2 different layouts for the type of each row

我知道也有類似的問題,但是我真的聽不懂,所以我決定再問一次。

我正在嘗試執行類似於聊天的操作,因此在列表視圖中將有2種類型的行,即已接收項目的行和已發送項目的行。 收到的將使recvRow.xml布局膨脹,而已發送的將使sendRow.xml布局膨脹。

我有一個應該顯示的項目列表(名稱,img等),並且我有一個布爾值,表示是否已發送或接收對象。

問題是這些布局具有不同的按鈕,例如,如果我先接收到某些內容,則顯然會加載recvRow.xml,但是如果我嘗試發送某些內容,它將拋出nullpointerexception,因為在僅存在的一個按鈕上在sendRow.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。

由於回收,您需要使用getItemViewType。 否則,您可以嘗試將收到的物品回收到未收到的視圖中,這將使事情更加混亂。 但是,基於該布爾值,getItemViewType僅返回0或1是可以的。 對於兩種視圖類型,它並不需要很復雜。

您應該在適配器中重寫getItemViewType() 此方法將指示應為每一行放大的視圖類型。 您還需要重寫getViewTypeCount()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM