ListView ничего не отображает в Android

-5

У меня есть класс 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;
}

Файл XML для main_activity:

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

спросил(а) 2021-01-25T19:57:01+03:00 4 месяца, 2 недели назад
1
Решение
76

Добавьте этот метод к вашему адаптеру, и он будет работать нормально.

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

ответил(а) 2021-01-25T19:57:01+03:00 4 месяца, 2 недели назад
45

Вам нужно добавить метод getCount() в ваш адаптер:

Функция getCount() возвращает общее количество элементов, отображаемых в списке. Он подсчитывает значение из метода size size() массива или длины массива.

Например, если у нас есть список элементов в arraylist, и мы должны отображать элементы в представлении списка, тогда мы можем подсчитать общее количество элементов, используя функцию размера, а затем это целочисленное значение возвращается функцией 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
}

Проверьте адаптер, в одном месте вы инициализировали свой текстовый вид как:

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());

Исправьте это, чтобы получить результат.

ответил(а) 2021-01-25T19:57:01+03:00 4 месяца, 2 недели назад
45

Просто возьмите эти строки из вашего оператора 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);

ответил(а) 2021-01-25T19:57:01+03:00 4 месяца, 2 недели назад
45

переопределить метод 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;
}

ответил(а) 2021-01-25T19:57:01+03:00 4 месяца, 2 недели назад
-5

замените его: public class UserAdapter extends BaseAdapter {

Таким образом: public class UserAdapter extends ArrayAdapter<User>

и лучше создать модель для Пользователя в другом классе;

Удачи

ответил(а) 2021-01-25T19:57:01+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема