CustomArrayAdapter 实现:无法获取资源id
CustomArrayAdapter 实现:无法获取资源id
我想实现CustomArrayAdapter,下面是我为自定义适配器编写的构造函数:
public CustomUsersAdapter(Context context, ArrayListusers) { super(context, 0, users); }
在super调用中的第二个参数是一个布局文件的资源ID,其中包含一个用于实例化视图的TextView。我不知道这里指的是哪个资源ID。有人可以详细解释一下指的是哪个资源ID吗?
我的重写的getView方法如下:
@Override public View getView(int position, View convertView, ViewGroup parent) { // 获取该位置的数据项 User user = getItem(position); // 检查是否正在重用现有视图,否则填充视图 if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_user, parent, false); } // 查找视图以填充数据 TextView tvName = (TextView) convertView.findViewById(R.id.tvName); TextView tvHome = (TextView) convertView.findViewById(R.id.tvHometown); // 使用数据对象将数据填充到模板视图中 tvName.setText(user.name); tvHome.setText(user.hometown); // 返回填充完成的视图以在屏幕上渲染 return convertView; }
CustomArrayAdapter的问题是无法获取资源ID。这个问题出现的原因是在构造函数的第二个参数中放入了0,因此它没有与任何布局相关联。根据文档的说明,构造函数的第一个参数是resource,用于指定一个包含实例化视图时使用的布局的布局文件的资源ID。如果将一个现有的布局放入构造函数,那么该布局将用于实例化listViewItems
的视图,但是你需要重写getView
方法来设计布局中的文本位置。如果你打算放入一个现有的布局,那么可以使用另一个构造函数:public ArrayAdapter (Context context, int resource, T[] objects)
。但是为了设计,我不会在构造函数中添加任何资源布局,而是直接在getView
方法中inflate
视图并返回该视图。正确的方法是使用ViewHolder模式,这是一种快速的方法。可以通过访问这个链接了解如何实现ViewHolder模式:codeofaninja.com/2013/09/...。如果你有的话,你可以在GitHub上提供一些关于这个问题的示例代码吗?只需按照如何实现ViewHolder模式的模式即可,这将提高你的ListView的性能。谢谢,这个方法对我有效。你能帮我回答这个问题吗:stackoverflow.com/questions/25549679/...
在这段代码中,自定义了一个CustomUsersAdapter类,继承自BaseAdapter类。该类的目的是用于显示一个用户列表。在该类中,定义了一个ViewHolder内部类,用于保存列表项的视图组件。在getView方法中,使用了ViewHolder模式来提高列表性能。具体而言,如果传入的view参数为空,就通过LayoutInflater将item_user布局文件转换成视图对象,并找到该视图对象中的tvName和tvHometown组件,并将它们保存在ViewHolder对象中,最后将ViewHolder对象保存在视图对象的Tag中。如果传入的view参数不为空,则直接从该视图对象中获取之前保存的ViewHolder对象。最后,通过ViewHolder对象将用户的姓名和家乡信息设置给tvName和tvHometown组件。
出现问题的原因是在布局文件item_user中,tvHometown组件的id被错误地设置成了tvName。这导致在getView方法中,通过findViewById方法找不到正确的组件,从而导致程序抛出异常。
要解决这个问题,只需要将布局文件item_user中tvHometown组件的id设置为正确的值即可。修改后的布局文件如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" /> <TextView android:id="@+id/tvHometown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hometown" /> </LinearLayout>
修改后的布局文件中,tvHometown组件的id被正确地设置为tvHometown,这样就能够正确地找到该组件了,从而解决了问题。
问题的原因是在CustomArrayAdapter的实现中未能获取到资源id。解决方法是修改CustomArrayAdapter的构造函数,将resLayout参数添加到构造函数中,并在构造函数中调用父类的构造函数。具体操作如下:
将原来的构造函数:
public CustomUsersAdapter(Context context, ArrayListusers) { super(context, 0, users); }
修改为:
public CustomUsersAdapter(Context context, int resLayout , ArrayListusers) { super(context, resLayout , users); }
其中,resLayout是指向自定义适配器类中的布局xml文件的资源id。
ArrayAdapter的语法为:
public ArrayAdapter (Context context, int resource, T[] objects)
更多信息可以参考这里。
问题已经编辑过,包括了getView方法。请问这样的做法是否正确?
你只需要在设置适配器到列表视图的地方修改适配器的构造函数,就像我在回答中修改的那样。