Я пытаюсь получить данные из firebase в ArrayList и отобразить информацию на ListView. Я использовал настраиваемый вид, но по какой-то причине отображается только первая запись. Я дважды проверил, отобразив детали с помощью Toast, и другие записи отображаются там, но они не отображаются на ListView.
Android ListView показывает только первый элемент
CustomAdapter.java
class CustomAdapter extends ArrayAdapter<String> {
private int layout;
public CustomAdapter(@NonNull Context context, int resource, @NonNull ArrayList<String> objects) {
super(context, resource, objects);
layout = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final String details = getItem(position);
ViewHolder viewHolder;
ViewHolder mainViewHolder = null;
if (convertView == null){
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(layout, parent, false);
viewHolder = new ViewHolder();
viewHolder.dealInfo = convertView.findViewById(R.id.dealinfo);
viewHolder.accept = convertView.findViewById(R.id.accept);
viewHolder.accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(), details, Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(viewHolder);
}else{
mainViewHolder = (ViewHolder) convertView.getTag();
mainViewHolder.dealInfo.setText(details);
}
return convertView;
}
}
class ViewHolder{
TextView dealInfo;
Button accept;
}
Мой макет элемента для ListView:
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout
...
..
android:layout_width = "match_parent"
android:layout_height = "wrap_content">
<TextView
android:id = "@+id/dealinfo"
android:layout_width = "282dp"
android:layout_height = "wrap_content"
android:fontFamily = "monospace"
android:textColor = "#ffffff"
android:textSize = "15sp"
android:textStyle = "bold" />
<Button
android:id = "@+id/accept"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_alignParentBottom = "true"
android:layout_alignParentRight = "true"
android:layout_alignParentTop = "true"
android:layout_centerVertical = "true"
android:layout_toEndOf = "@+id/dealinfo"
android:background = "#000000"
android:text = "Accept"
android:textColor = "#ffffff"
android:textStyle = "bold" />
</RelativeLayout>
Мой ListView xml:
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:
...
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".ManagerActivity">
<TextView
android:id = "@+id/title"
android:layout_width = "match_parent"
android:layout_height = "48dp"
android:layout_alignParentTop = "true"
android:text = "MANAGER"
android:textAlignment = "center"
android:gravity = "center"
..../>
<ListView
android:id = "@+id/listview"
android:layout_width = "match_parent"
android:layout_height = "500dp"
android:layout_below = "@+id/title"
android:layout_alignParentBottom = "true"
android:background = "#1fa781"
android:divider = "#ffffff"
android:dividerHeight = "6dp">
</ListView>
</RelativeLayout>
Обновлено:
Я удалил оператор else в getView(), и теперь он работает. Почему так?
Вот что я сделал:
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final String details = getItem(position);
ViewHolder viewHolder;
ViewHolder mainViewHolder = null;
if (convertView == null){
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(layout, parent, false);
viewHolder = new ViewHolder();
viewHolder.dealInfo = convertView.findViewById(R.id.dealinfo);
viewHolder.accept = convertView.findViewById(R.id.accept);
viewHolder.accept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getContext(), details, Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(viewHolder);
}
{
mainViewHolder = (ViewHolder) convertView.getTag();
mainViewHolder.dealInfo.setText(details);
}
return convertView;
}
Проверьте свою декларацию о возврате. Вы всегда возвращаете convertView, даже когда заходите в ветку else. Когда вы переходите в ветку else, вы устанавливаете значения для mainViewHolder, но затем игнорируете эту переменную и возвращаете convertView.
ваша проблема решена?
Да решено ... Спасибо!
Попробуй и расскажи мне, что случилось
final String details = getItem(position);
ViewHolder viewHolder;
ViewHolder mainViewHolder = null;
if (convertView == null){
LayoutInflater inflater = LayoutInflater.from(getContext());
//...
//others codes
//...
ViewHolder.dealInfo.setText(details);//ADD THIS LINE
convertView.setTag(viewHolder);
}
Ваше предложение привело к сбою моего приложения. Но с моим редактированием все работает. (Пожалуйста, проверьте, что я сделал в Edit.) Я только что удалил предложение else ... Не тело else, а его работу
забудьте изменить mainViewHolder на ViewHolder
Я думаю, вам не хватает деталей, которые нужно настроить для отдельных элементов просмотра. dealinfo