CustomArrayAdapter 实现:无法获取资源id

9 浏览
0 Comments

CustomArrayAdapter 实现:无法获取资源id

我想实现CustomArrayAdapter,下面是我为自定义适配器编写的构造函数:

public CustomUsersAdapter(Context context, ArrayList users) {
    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;
}

0
0 Comments

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/...

0
0 Comments

在这段代码中,自定义了一个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,这样就能够正确地找到该组件了,从而解决了问题。

0
0 Comments

问题的原因是在CustomArrayAdapter的实现中未能获取到资源id。解决方法是修改CustomArrayAdapter的构造函数,将resLayout参数添加到构造函数中,并在构造函数中调用父类的构造函数。具体操作如下:

将原来的构造函数:

public CustomUsersAdapter(Context context, ArrayList users) {
    super(context, 0, users);
}

修改为:

public CustomUsersAdapter(Context context, int resLayout , ArrayList users) {
    super(context, resLayout , users);
}

其中,resLayout是指向自定义适配器类中的布局xml文件的资源id。

ArrayAdapter的语法为:

public ArrayAdapter (Context context, int resource, T[] objects)

更多信息可以参考这里

问题已经编辑过,包括了getView方法。请问这样的做法是否正确?

你只需要在设置适配器到列表视图的地方修改适配器的构造函数,就像我在回答中修改的那样。

0