每行类型的2种不同布局

时间:2016-09-25 23:49:59

标签: java android xml android-layout listview

我知道有类似的问题,但我真的不明白,所以我决定再问一次。

我正在尝试做类似聊天的事情,因此在列表视图中会有两种类型的行,即收到的项目和已发送项目的行。收到的文件会使recvRow.xml布局膨胀,而发送的文件将会使sentRow.xml布局膨胀。

我有一个显示的项目列表(名称,img等),我有一个布尔值,表示对象是发送还是接收。

问题是那些布局有不同的按钮,如果我先收到一些东西,它显然会加载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 个答案:

答案 0 :(得分:2)

由于回收,您需要使用getItemViewType。否则,您可以尝试将收到的项目回收到未收到的视图中,这将使事情变得非常糟糕。但是,getItemViewType可以根据该布尔值返回0或1。对于2种视图类型,它不需要非常复杂。

答案 1 :(得分:1)

您应该覆盖适配器中的getItemViewType()。此方法将指示应为每行充气的视图类型。您还需要覆盖getViewTypeCount()