Java 自定义适配器ViewHolder问题
我正在尝试为列表使用自定义适配器。此列表有两种类型的行,但我只使用一种布局(将可见性设置为Java 自定义适配器ViewHolder问题,java,android,adapter,Java,Android,Adapter,我正在尝试为列表使用自定义适配器。此列表有两种类型的行,但我只使用一种布局(将可见性设置为View.GONE)时保留我不需要的项目)。但是,在尝试访问editbox样式行时,我不断收到类强制转换异常。我几乎没有定制适配器的经验。非常感谢你的帮助 下面是代码(我删除了setonclicklisteners以保持简短): 公共类SubEventListAdapter扩展了ArrayAdapter { 私有数组列表项; 私人语境(private Context)(私人语境);; public SubE
View.GONE
)时保留我不需要的项目)。但是,在尝试访问editbox样式行时,我不断收到类强制转换异常。我几乎没有定制适配器的经验。非常感谢你的帮助
下面是代码(我删除了setonclicklisteners以保持简短):
公共类SubEventListAdapter扩展了ArrayAdapter
{
私有数组列表项;
私人语境(private Context)(私人语境);;
public SubEventListAdapter(上下文、ArrayList项)
{
super(上下文,R.layout.view\u选择\u事件\u项目3,项目);
此项。_项=项;
这._context=context;
}
静态类视窗夹
{
文本查看文本;
图像按钮图像按钮;
图像视图检查;
编辑文本编辑文本;
按钮;
}
@凌驾
public int getCount()
{
返回此项。_items.size();
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图v=转换视图;
最终持票人;
最终MobileSubEvent事件=_items.get(位置);
如果(v==null)
{
LayoutInflater\u充气器=(LayoutInflater)this.getContext().getSystemService(Context.LAYOUT\u充气器\u服务);
v=\u充气器。充气(R.layout.view\u select\u event\u item3,null);
viewHolder=新的viewHolder();
viewHolder.imagebutton=(imagebutton)v.findViewById(R.id.ibNext);
viewHolder.text=(TextView)v.findViewById(R.id.EVENT);
viewHolder.check=(ImageView)v.findviewbyd(R.id.ivCheck);
viewHolder.button=(button)v.findViewById(R.id.bscanosign);
viewHolder.editText=(editText)v.findViewById(R.id.etInput);
v、 setTag(视图持有者);
}否则
{
v=转换视图;
viewHolder=(viewHolder)v.getTag();//这里是类强制转换异常发生的地方
}
if(viewHolder.text!=null)
viewHolder.text.setText(this.u items.get(position.get_description());
v、 setTag(this._items.get(position));
...
返回v;
}
日志:
查看\选择\事件\项目3:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:padding="5dip" >
<ImageView
android:id="@+id/ivCheck"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_gravity="center_vertical"
android:background="@drawable/check"
android:focusable="false"
android:visibility="invisible" />
<TextView
android:id="@+id/EVENT"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/ivCheck"
android:background="@android:color/transparent"
android:padding="5dp"
android:text="Sample text"
android:textSize="20sp"
android:textStyle="bold"
android:visibility="visible"
/>
<EditText
android:id="@+id/etInput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="130dp"
android:maxWidth="165dp"
android:layout_toRightOf="@id/ivCheck"
android:background="@android:drawable/editbox_background"
android:padding="5dp"
android:hint="Hint text"
android:singleLine="true"
android:text=""
android:textSize="20sp"
android:visibility="invisible"
/>
<Button
android:id="@+id/bScanOrSign"
android:layout_width="62dp"
android:layout_height="32dp"
android:layout_gravity="center_vertical"
android:layout_toLeftOf="@id/ibNext"
android:text="Scan"
android:visibility="invisible"
/>
<ImageButton
android:id="@+id/ibNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="right|center_vertical"
android:background="@drawable/right"
android:visibility="invisible" />
</RelativeLayout>
在getView中尝试此操作,如果convertView对象(View Holder对象)的类名与ViewHolder的类名不匹配(在我的示例中是VisitsListViewHolder),请检查其是否为空,以便为View Holder创建新实例
if(convertView != null)
{
String className = convertView.getTag().getClass().getName();
if(!className.equalsIgnoreCase("VisitsListViewHolder"))
{
convertView = null;
}
}
“editbox样式行”?@AhmadKayyali,我的意思是具有edittext字段
viewHolder.edittext=(edittext)v.findViewById(R.id.etInput)的行
此项?如果是,则显示视图选择事件项3.xml异常是正常的。创建行视图时,创建并设置一个ViewHolder
作为标记,然后在下面指定一个MobileSubEvent
项作为行标记。1.在列表视图中设置EditText
项有点棘手,因此关于如何处理这个问题,stackoverflow有很多问题。2.适配器的getView()
方法不正确,如果条件没有else
子句将行设置回正确的值,则可能是。
if(convertView != null)
{
String className = convertView.getTag().getClass().getName();
if(!className.equalsIgnoreCase("VisitsListViewHolder"))
{
convertView = null;
}
}