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 上的最后一项被切断的主要内容,如果未能解决你的问题,请参考以下文章