【问题标题】:ListView not displaying anything in AndroidListView 在 Android 中不显示任何内容
【发布时间】:2017-04-10 04:14:41
【问题描述】:

我有一个 Java 类,其中包含有关用户的信息(姓名、年龄、类别、标记)。我正在尝试创建一个列表视图来显示不同的用户(只有他们的姓名和年龄)。

由于某种原因,未显示列表视图。为什么?

MainActivity.java:

public class MainActivity extends AppCompatActivity {

 private ListView listView;
 private UserAdapter userAdapter;
 private ArrayList<User> userList;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

     userList = new ArrayList<>();
     DefaultList(); //calls default list function, with dummy values
     listView = (ListView) findViewById(R.id.userListView);

     //Associating the adapter with the monster list
     userAdapter = new userAdapter(this, userList);
     listView.setAdapter(userAdapter);
 } 

 public boolean onCreateOptionsMenu(Menu menu){
     return true;
 }

 //Initializes the list view with some default values, for testing purposes only
 private void DefaultList(){
     userList.add(new User("Nat", 17, "MBS", 4, "98"));
     userList.add(new User("Dave", 27, "BIS", 1, "54"));
     userList.add(new User("Gray", 21, "BIS", 2, "51"));
     userList.add(new User("John", 20, "BIS", 1, "76"));
 }
}

列表视图的自定义适配器:

public class UserAdapter extends BaseAdapter {
private Context currentContext;
private ArrayList<User> userList;


public static class ViewHolder {
    TextView uName;
    TextView uAge;
}
public UserAdapter(Context context, ArrayList<User> user){
    currentContext = context;
    userList = user;
}
public View getView(int i, View view, ViewGroup viewGroup) {

    //If view not created, inflate the view
    ViewHolder viewHolder;
    if(view == null){
        viewHolder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) currentContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        view = inflater.inflate(R.layout.user_item, null);

        //attach the ViewHolder to this view
        viewHolder = new ViewHolder();
        viewHolder.userName = (TextView) view.findViewById(R.id.uNameTextView);
        viewHolder.userAge = (TextView) view.findViewById(R.id.uAgeTextView);
        view.setTag(viewHolder);
    }
    else{
        //View already created
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.uName.setText(userList.get(i).getUserName());
    viewHolder.uAge.setText(userList.get(i).getUserAge());
    return view;
}

main_activity 的 XML 文件:

    <ListView
    android:id="@+id/userListView"
    style="@style/Widget.AppCompat.ListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentEnd="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="10dp"
    android:visibility="visible" />`

每个用户列表项的 XML:

  <TextView
    android:id="@+id/uNameTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="16dp"
    android:layout_marginTop="20dp"
    android:text="Name" />

  <TextView
    android:id="@+id/uAgeTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignStart="@+id/uNameTextView"
    android:layout_below="@+id/uNameTextView"
    android:text="Age" />

我正在使用 Android Studio。

【问题讨论】:

  • 安卓显示器有什么错误吗?
  • @ScottS 显示器上没有错误。当我运行应用程序时它显示一个空白屏幕。

标签: java android listview android-adapter custom-adapter


【解决方案1】:

将此方法添加到您的适配器中,它将正常工作。

 @Override
    public int getCount() {
        return userList != null ? userList.size() : 0;
    }

【讨论】:

  • 包含此语句解决我的应用程序关闭
  • 检查 userList 是否为空。如果 userList 为空,那么您的应用程序将崩溃。为避免崩溃,您可以进行检查。查看更新后的答案。
【解决方案2】:

覆盖getView方法

@Override
        public View getView(int i, View view, ViewGroup viewGroup) {

    //If view not created, inflate the view
    ViewHolder viewHolder;
    if(view == null){
        viewHolder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) currentContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        view = inflater.inflate(R.layout.user_item, null);

        //attach the ViewHolder to this view
        viewHolder = new ViewHolder();
        viewHolder.userName = (TextView) view.findViewById(R.id.uNameTextView);
        viewHolder.userAge = (TextView) view.findViewById(R.id.uAgeTextView);
        view.setTag(viewHolder);
    }
    else{
        //View already created
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.uName.setText(userList.get(i).getUserName());
    viewHolder.uAge.setText(userList.get(i).getUserAge());
    return view;
}

【讨论】:

  • 我认为你应该检查你的代码。什么是怪物适配器?是构造函数吗?但你的班级名称是 UserAdapter
  • 这是一个打字错误,很抱歉。我已经更正了。
【解决方案3】:

您需要在适配器中添加 getCount() 方法:

getCount() 函数返回待处理的项目总数 显示在列表中。它计算数组列表 size() 方法中的值 或数组的长度。

例如,如果我们有一个元素列表 一个数组列表,我们必须在列表视图中显示项目然后我们 可以使用 size 函数计算元素的总数 然后该整数值由函数 getCount() 返回为 如下所示。

@Override
public int getCount() {
   int count=arrayList.size(); //counts the total number of elements from the arrayList
   return count;//returns the total count to adapter
}

检查您的适配器,在某个地方您已将 textView 初始化为:

viewHolder.userName = (TextView) view.findViewById(R.id.uNameTextView);
viewHolder.userAge = (TextView) view.findViewById(R.id.uAgeTextView);

还有其他的,

 viewHolder.uName.setText(userList.get(i).getUserName());
 viewHolder.uAge.setText(userList.get(i).getUserAge());

请修复此问题以获得结果。

【讨论】:

  • 包含此语句已解决我的应用程序强制关闭
  • 它说 - 致命异常:主进程:com.example.user101.StudentView,PID:26694 android.content.res.Resources$NotFoundException:字符串资源 ID #0x11
  • 是的。现在工作。谢谢!
【解决方案4】:

只需将这些行从您的 if 语句中删除即可。我认为您的view 第一次不为空,这会引起麻烦。

LayoutInflater inflater = (LayoutInflater) currentContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

view = inflater.inflate(R.layout.user_item, null);
viewHolder.userName = (TextView) view.findViewById(R.id.uNameTextView);
viewHolder.userAge = (TextView) view.findViewById(R.id.uAgeTextView);

【讨论】:

    【解决方案5】:

    替换它:public class UserAdapter extends BaseAdapter {

    通过这个:public class UserAdapter extends ArrayAdapter&lt;User&gt;

    最好在其他类中为用户创建模型;

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多