Listview 上的最后一项被切断

Posted

技术标签:

【中文标题】Listview 上的最后一项被切断【英文标题】:Last Item on Listview is cut off 【发布时间】:2016-02-25 02:27:48 【问题描述】:

所以在我的 android 应用程序中,我的主要活动有标签,并且在每个标签中都有一个包含列表视图的片段。但由于某种原因,列表视图中的最后一项总是被切断。我四处寻找解决方案,但我还没有找到任何解决方案。有什么建议吗?

主 Activity 布局

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rl"
    android:layout_
    android:layout_>

    <android.support.design.widget.AppBarLayout
        android:layout_
        android:layout_
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            app:tabMode="fixed"
            app:tabGravity="fill"/>


    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_
        android:layout_
        app:layout_behavior="@string/appbar_scrolling_view_behavior"  />
</android.support.design.widget.CoordinatorLayout>

带有 ListView 的片段

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical">

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_
        android:layout_
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        style="@style/Widget.AppCompat.ProgressBar" />

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:orientation="vertical">

        <ListView
            android:id="@+id/list"
            android:layout_
            android:layout_
            style="@style/Widget.AppCompat.ProgressBar"></ListView>

    </LinearLayout>
</RelativeLayout>

列表项布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_
    android:padding="2dp"
    android:layout_margin="5dp">

    <TextView
        android:layout_
        android:layout_
        android:text="New Text"
        android:id="@+id/title"
        android:textSize="20sp"
        android:textStyle="bold"
        android:typeface="normal"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_
        android:layout_
        android:text="New Text"
        android:id="@+id/author"
        android:textSize="15sp"
        android:typeface="normal"
        android:layout_below="@+id/publishdate"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    <TextView
        android:layout_
        android:layout_
        android:text="New Text"
        android:id="@+id/publishdate"
        android:textSize="15sp"
        android:typeface="normal"
        android:layout_below="@+id/title"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</LinearLayout>

列出适配器类

package com.czhou.dailyprincetoniannewspaper.adapters;

import android.content.ClipData;
import android.content.Context;
import android.graphics.Paint;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;


import com.czhou.dailyprincetoniannewspaper.NewspaperMetaObject;
import com.czhou.dailyprincetoniannewspaper.R;

import java.util.List;

public class NewsListAdapter extends ArrayAdapter<NewspaperMetaObject> 

    static class ViewHolder 
        TextView author;
        TextView publishdate;
        TextView title;
    

    private LayoutInflater inflater;
    List<NewspaperMetaObject> newsitems;
    public NewsListAdapter(Context context, List<NewspaperMetaObject> items) 
        super(context, R.layout.newslistitem, items);
        this.newsitems = items;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

             ViewHolder viewHolder;

        if (convertView == null) 
            convertView = inflater.inflate(R.layout.newslistitem, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.title = (TextView) convertView.findViewById(R.id.title);
            viewHolder.author = (TextView) convertView.findViewById(R.id.author);
            viewHolder.publishdate = (TextView) convertView.findViewById(R.id.publishdate);
            convertView.setTag(viewHolder);

         else 
            viewHolder = (ViewHolder) convertView.getTag();
        

        viewHolder.title.setText(newsitems.get(position).getArticleTitle());
        viewHolder.title.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
        viewHolder.publishdate.setText(newsitems.get(position).getArticlePublishDate());
        viewHolder.author.setText(newsitems.get(position).getArticleAuthor());
        System.out.println(viewHolder.publishdate.getText());

        return convertView;
    


主要活动类

package com.czhou.dailyprincetoniannewspaper;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;

import java.util.ArrayList;
import java.util.List;
/**
 * Created by czhou on 11/21/2015.
 */
public class MainActivity extends AppCompatActivity 

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private ProgressBar mProgressBar;
    private CoordinatorLayout coordinatorLayout;

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

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    

    private void setupViewPager(ViewPager viewPager)
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new PUNewsFragment(), "News");
        adapter.addFragment(new PUSportsFragment(), "Sports");

        viewPager.setAdapter(adapter);
    

    class ViewPagerAdapter extends FragmentPagerAdapter 
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) 
            super(manager);
        

        @Override
        public Fragment getItem(int position) 
            return mFragmentList.get(position);
        

        @Override
        public int getCount() 
            return mFragmentList.size();
        

        public void addFragment(Fragment fragment, String title) 
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        

        @Override
        public CharSequence getPageTitle(int position) 
            return mFragmentTitleList.get(position);
        
    

【问题讨论】:

你最后改用 RecyclerView 了吗?看来您不能将 ArrayAdapter 与令人沮丧的 RecyclerView 一起使用。 【参考方案1】:

android:paddingBottom="20dp" 之类的行放入 Fragment XML 文件的 ListView 项中。调整 20dp 值,直到它看起来像您想要的那样。

出于某种奇怪的原因,它只是解决了问题,并且与更改的 ListView 的大小无关。不知何故,小填充迫使 ListView 以不同的方式布局。

【讨论】:

也许人们会说 RecyclerView 更好......但这实际上是一个完美的快速解决问题的方法,而无需为单个 UI 错误重构太多东西。救了我! 很高兴听到这个消息,我同意你的看法。不推荐使用 ListView 是有原因的。对于简单的垂直列表来说,这是一个有用的小部件。【参考方案2】:

在您的 RecyclerView 中添加以下行应该可以解决问题。

android:layout_marginBottom="?attr/actionBarSize"

【讨论】:

【参考方案3】:

使用 RecyclerView 代替 ListView。它肯定会起作用。工具栏的滚动会剥离布局的底部空间。 ListView 不能与app:layout_behavior="@string/appbar_scrolling_view_behavior" 完美配合。如果你想滚动和查看完整的项目,请使用 RecyclerView 或 NestedScrollView 而不是 ListView。

如果您删除 app:layout_behavior="@string/appbar_scrolling_view_behavior"

app:layout_scrollFlags="scroll|enterAlways"  

您可以在工具栏上看到带有完整项目的 ListView。

所以,使用 RecyclerView 而不是 ListView 与 app:layout_behavior="@string/appbar_scrolling_view_behavior"app:layout_scrollFlags="scroll|enterAlways"。它适用于滚动和布局行为。

【讨论】:

好建议。我面临同样的问题,但就我而言,我使用的是可扩展列表视图,我发现使用可扩展列表视图实现回收器视图有点困难。我现在不想使用自定义库。有什么解决方案出现在您的脑海中。?我尝试添加 paddingBottom,但这不起作用。【参考方案4】:

对于仍然遇到此问题的任何人,删除操作栏对我有用。

在您的 AndroidManifest 中:

android:theme="@style/AppTheme.NoActionBar">

同时从 Activity 的布局 XML 中删除操作栏。

并从您的 Activity 类中删除它:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

【讨论】:

这对于绝大多数应用来说并不实用,因为操作栏是 Android 应用的标准 UI 组件。

以上是关于Listview 上的最后一项被切断的主要内容,如果未能解决你的问题,请参考以下文章

listview.setSelection()

listview 如何总让最后一项选中?????

ListView内的Android约束布局 - 最后一项样式被破坏

Listview一遍又一遍地只显示最后一项

1.2ListView优化之Viewholder

由Toolbar造成的ListView最后一项显示不全