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;
}
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;
}