Android:ListView 仅显示第一项。 (请参考提供的图片)

Posted

技术标签:

【中文标题】Android:ListView 仅显示第一项。 (请参考提供的图片)【英文标题】:Android: ListView shows only first item. (Please refer image provided) 【发布时间】:2019-02-22 05:09:34 【问题描述】:

我正在尝试将数据从 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_
        android:layout_>

        <TextView
            android:id="@+id/dealinfo"
            android:layout_
            android:layout_
            android:fontFamily="monospace"
            android:textColor="#ffffff"
            android:textSize="15sp"
            android:textStyle="bold" />

        <Button
            android:id="@+id/accept"
            android:layout_
            android:layout_
            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_
    android:layout_
    tools:context=".ManagerActivity">

    <TextView
        android:id="@+id/title"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:text="MANAGER"
        android:textAlignment="center"
        android:gravity="center"
        ..../>

    <ListView
        android:id="@+id/listview"
        android:layout_
        android:layout_
        android:layout_below="@+id/title"
        android:layout_alignParentBottom="true"
        android:background="#1fa781"
        android:divider="#ffffff"
        android:dividerHeight="6dp">

    </ListView>


</RelativeLayout>

编辑: 我删除了getView() 中的else 语句,它现在可以工作了。为什么这样? 这就是我所做的:

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

【问题讨论】:

我认为您缺少要在单个视图项上设置的详细信息。交易信息 检查您的退货声明。即使您进入else 分支,您也总是返回convertView。当您进入else 分支时,您设置了mainViewHolder 的值,然后忽略该变量并返回convertView 你的问题解决了吗? 是的,它已经解决了......谢谢! 【参考方案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);
    

【讨论】:

你的建议让我的应用崩溃了。但是通过我的编辑,它可以正常工作。 (请检查我在编辑中做了什么。)我刚刚删除了 else 子句......不是 else 主体,它的工作原理 忘记将 mainViewHolder 更改为 ViewHolder

以上是关于Android:ListView 仅显示第一项。 (请参考提供的图片)的主要内容,如果未能解决你的问题,请参考以下文章

带有适配器的 Android 列表视图仅显示第一项(多次)

Android NestedScrollView 在 ListView 中仅显示一项

从listView中删除项目仅删除最后一项未选择的元素android

将listview中的第一项设置为android的默认值

使用 Cursor Loader 选择 ListView 中的第一项

仅显示一项的列表视图