2015-11-23 31 views
6

Tak więc w mojej aplikacji na Androida mam główną aktywność, która ma zakładki, a na każdej karcie znajduje się fragment zawierający widok listy. Ale z jakiegoś powodu ostatni element listy jest zawsze odcięty. Rozglądałem się za rozwiązaniami, ale nie znalazłem jeszcze żadnych. Jakieś sugestie?Ostatnia pozycja na liście jest obcięta

Główny aktywny układ

<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_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      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_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabMode="fixed" 
      app:tabGravity="fill"/> 


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

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

Fragment z ListView

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

    <ProgressBar 
     android:id="@+id/progressBar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     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_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical"> 

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

    </LinearLayout> 
</RelativeLayout> 

Układ Wykaz egzemplarzy

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

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     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_width="match_parent" 
     android:layout_height="wrap_content" 
     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_width="match_parent" 
     android:layout_height="wrap_content" 
     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> 

Lista Adapter Class

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

} 

Klasa Main Activity

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); 
     } 
    } 
} 
+0

Czy w końcu zmieniłeś się w RecyclerView?Wygląda na to, że nie można używać ArrayAdapter z RecyclerView, co jest frustrujące. – jaynp

Odpowiedz

10

Zastosowanie RecyclerView zamiast ListView. To zadziała na pewno. Przewijanie paska narzędzi usuwa dolną część układu. ListView nie działa idealnie z app:layout_behavior="@string/appbar_scrolling_view_behavior". Jeśli chcesz przewijać i wyświetlać pełne przedmioty, użyj RecyclerView lub NestedScrollView zamiast ListView.

Jeśli usuniesz app:layout_behavior="@string/appbar_scrolling_view_behavior" i

app:layout_scrollFlags="scroll|enterAlways" 

z paska narzędzi można zobaczyć ListView z egzemplarze.

Używaj RecyclerView zamiast ListView z app:layout_behavior="@string/appbar_scrolling_view_behavior" i app:layout_scrollFlags="scroll|enterAlways". Będzie działać z przewijaniem i zachowaniem układu.

+0

Dobra sugestia. Mam do czynienia z tym samym problemem, ale w moim przypadku używam widoku listy rozwijanej i stwierdzam, że implementowanie widoku Recycler z rozwijanym widokiem listy jest nieco trudne. Nie chcę używać niestandardowych bibliotek w tym momencie. Jakieś rozwiązanie przychodzi ci na myśl. Próbowałem dodać paddingBottom, ale to nie działa. – AndroidGuy

14

Umieść w wierszu takim jak android:paddingBottom="20dp" do elementu ListView w pliku XML fragmentu. Dostosuj wartość 20dp, aż będzie wyglądać tak, jak chcesz.

Z jakiegoś dziwnego powodu po prostu rozwiązuje problem i nie ma nic wspólnego z rozmiarem listy ListView. W jakiś sposób małe wypełnienie zmusza ListView do układu w inny sposób.

+0

Być może ludzie mogą twierdzić, że RecyclerView jest lepszy ... ale to jest rzeczywiście doskonała poprawka do problemu bez konieczności refaktoryzacji zbyt wielu rzeczy dla pojedynczego błędu interfejsu. Uratowałeś mnie! – BlackBox

+0

Cieszę się, że to słyszę i zgadzam się z tobą. ListView nie jest przestarzałe z jakiegoś powodu. Jest to przydatny widget dla prostej listy pionowej. – Gi0rgi0s

0

Dla każdego, kto wciąż ma ten problem, usunięcie paska akcji działało dla mnie.

Wewnątrz AndroidManifest:

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

także usunąć pasek działań z XML układ dla działania.

i usunąć to z twojej klasy aktywny:

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

Dodawanie poniżej linii w swojej RecyclerView powinno rozwiązać ten problem.

android:layout_marginBottom="?attr/actionBarSize"