Android 自定义列表视图未显示

Android coustom Listview is not showing

UserInfo 模型有名称、电子邮件、照片三个字段,但只想在列表视图中显示名称。当用户单击列表视图时,然后获取所有字段,如姓名、照片电子邮件

还想在列表视图中设置过滤器

我的列表视图适配器class

public class UsersAdapter extends  ArrayAdapter<UserInfo> {
    ArrayList<UserInfo> users;
    Context context;
    LayoutInflater inflater;
    public UsersAdapter(Context context, ArrayList<UserInfo> users) {
        super(context,R.id.tvName, users);
       this.users= users;
       this.context= context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Holder holder;
        if(convertView == null) {
            convertView = inflater.inflate(R.layout.items, null);
            holder = new Holder();
            convertView.setTag(holder);
            } else {
                holder = (Holder) convertView.getTag();
            }

        holder.tvName = (TextView) convertView.findViewById(R.id.tvName);
        holder.tvName.setText(users.get(position).getName());
        return convertView;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public UserInfo getItem(int position) {
        // TODO Auto-generated method stub
        return users.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    private class Holder {
        TextView tvName;
    }

问题出在 getcount 方法上,它应该如下所示。

@Override
public int getCount () {
    return users.size();
}

ArrayAdapter 已经实现了方法 getItem()、getCount() 并存储了显示项目的 ArrayList,因此

如果你使用 ArrayAdapter<UserInfo> 你不需要保存

private ArrayList<UserInfo> users;

因为在你的实例中,你的构造函数给了 super

super(context,R.id.tvName, users) //users <-- the List<>

因此您可以删除函数,因为它们已经由 ArrayAdapter 实现

@Override
public int getCount() {
    return 0;
}

@Override
public UserInfo getItem(int position) {
    return users.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

并且在您的 createView() 中,您应该像这样使用 getItem(position)

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Holder holder;
    if(convertView == null) {
        convertView = inflater.inflate(R.layout.items, convertView, false);
        holder = new Holder();
        convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }

    holder.tvName = (TextView) convertView.findViewById(R.id.tvName);
    holder.tvName.setText(getItem(position).getName()); //<--------------
    return convertView;
}

正如用户 apk 所说,您的 getCount() 方法需要显示您的适配器上有多少项目,并且没有必要将 [LayoutInflater][1] 用作全局变量。最重要的是你忘了初始化充气机。

所以这是你必须做的:

1- 修复您的 getCount()(感谢 apk 注意到这一点)

@Override
public int getCount () {
    return users.size();
}

2- 您仍然可以将 LayoutInflater 作为全局使用,但实际上没有必要这样做。无论如何,在你的 getView 方法上,尝试这样做:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Holder holder;
    if(convertView == null) {
        inflater = (LayoutInflater) context_.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); // Use this to get the inflater.
        convertView = inflater.inflate(R.layout.items, null);
        holder = new Holder();
        convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }

    holder.tvName = (TextView) convertView.findViewById(R.id.tvName);
    holder.tvName.setText(users.get(position).getName());
    return convertView;
}