Android: ListView показывает только первый элемент. (См. Предоставленное изображение)

Я пытаюсь получить данные из firebase в ArrayList и отобразить информацию на ListView. Я использовал настраиваемый вид, но по какой-то причине отображается только первая запись. Я дважды проверил, отобразив детали с помощью Toast, и другие записи отображаются там, но они не отображаются на ListView.

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

Я думаю, вам не хватает деталей, которые нужно настроить для отдельных элементов просмотра. dealinfo

Rizwan 18.09.2018 10:23

Проверьте свою декларацию о возврате. Вы всегда возвращаете convertView, даже когда заходите в ветку else. Когда вы переходите в ветку else, вы устанавливаете значения для mainViewHolder, но затем игнорируете эту переменную и возвращаете convertView.

frozenkoi 18.09.2018 12:03

ваша проблема решена?

Radesh 13.10.2018 14:04

Да решено ... Спасибо!

Anjali Nitish 13.10.2018 14:22
0
4
232
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй и расскажи мне, что случилось

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, а его работу

Anjali Nitish 18.09.2018 11:32

забудьте изменить mainViewHolder на ViewHolder

Radesh 18.09.2018 11:37

Другие вопросы по теме