gpt4 book ai didi

java - 每行类型有 2 种不同的布局

转载 作者:行者123 更新时间:2023-12-01 21:17:36 24 4
gpt4 key购买 nike

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

我正在尝试执行类似于聊天的操作,因此在 ListView 中将有两种类型的行,即已接收项目的行和已发送项目的行。收到的数据将扩充recvRow.xml 布局,发送的数据将扩充sentRow.xml 布局。

我有一个应该显示的项目列表(名称、img 等),并且我有一个 boolean 值来表示对象是否已发送或接收。

问题是这些布局有不同的按钮,如果我先收到一些东西,它显然会加载recvRow.xml,但是如果我尝试发送一些东西,它会抛出一个 nullpointerException 因为在其中一个按钮上仅存在于sentRow.xml 布局中(并且不存在于recvRow.xml 中)。

由于我正在检查之前告诉过你们的 boolean 值,因此我认为没有必要使用 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。否则,您可以尝试将收到的项目回收到未收到的 View 中,这会彻底搞砸事情。然而,getItemViewType 根据该 boolean 值仅返回 0 或 1 是可以的。对于 2 种 View 类型来说,它不需要非常复杂。

关于java - 每行类型有 2 种不同的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39692940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com