Tämä on esimerkki siitä, miten se olisi voitu tehdä aiemmin ListView
-luokassa käyttämällä parametreja divider ja dividerHeight:
<ListView
android:id="@+id/activity_home_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp"/>
En kuitenkaan näe tällaista mahdollisuutta RecyclerView
-luokassa.
<android.support.v7.widget.RecyclerView
android:id="@+id/activity_home_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
Onko siinä tapauksessa ok määritellä marginaalit ja/tai lisätä mukautettu jakajanäkymä suoraan luettelokohteen'n ulkoasuun vai onko olemassa parempi tapa saavuttaa tavoitteeni?
Lokakuun 2016 päivitys
Android-tukikirjaston versiossa 25.0.0 otettiin käyttöön DividerItemDecoration
-luokka:
DividerItemDecoration on RecyclerView.ItemDecoration, jota voidaan käyttää
LinearLayoutManager
-luokan kohteiden välisenä jakajana. Se tukee sekäHORIZONTAL
- ettäVERTICAL
-suuntauksia.
Käyttö:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Edellinen vastaus
Joissakin vastauksissa on käytetty menetelmiä, jotka on sittemmin poistettu käytöstä, tai ne eivät anna täydellistä ratkaisua, joten yritin tehdä lyhyen, ajantasaisen yhteenvedon.
Toisin kuin ListView
-luokassa, RecyclerView
-luokassa ei ole jakajiin liittyviä parametreja. Sen sijaan sinun on laajennettava ItemDecoration
, RecyclerView
'n sisäistä luokkaa:
ItemDecoration
:n avulla sovellus voi lisätä erityisen piirroksen ja asettelun offsetin tiettyihin nimikenäkymiin sovittimen'datajoukosta. Tämä voi olla hyödyllistä kohteiden välisten erottimien, korostusten, visuaalisten ryhmittelyrajojen ja muiden piirustusten piirtämisessä.
Kaikki
ItemDecorations
piirretään siinä järjestyksessä kuin ne on lisätty, ennen kohteen näkymiä (kohdassaonDraw()
) ja kohteiden jälkeen (kohdassa onDrawOver(Canvas
,RecyclerView
,RecyclerView.State)
).
Vertikaalinen
väli ItemDecoration
.Laajenna ItemDecoration
, lisää mukautettu konstruktori, joka ottaa parametrina tilan height
ja ohita getItemOffsets()
-metodi:
public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {
private final int verticalSpaceHeight;
public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
this.verticalSpaceHeight = verticalSpaceHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
outRect.bottom = verticalSpaceHeight;
}
}
Jos et halua lisätä välilyöntiä viimeisen kohteen alle, lisää seuraava ehto:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Huomautus: voit myös muuttaa outRect.top
-, outRect.left
- ja outRect.right
-ominaisuuksia halutun vaikutuksen aikaansaamiseksi.
ItemDecoration
Laajenna ItemDecoration
ja ohita onDraw()
-metodi:
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable divider;
/**
* Default divider will be used
*/
public DividerItemDecoration(Context context) {
final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
divider = styledAttributes.getDrawable(0);
styledAttributes.recycle();
}
/**
* Custom divider will be used
*/
public DividerItemDecoration(Context context, int resId) {
divider = ContextCompat.getDrawable(context, resId);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + divider.getIntrinsicHeight();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
}
Voit joko kutsua ensimmäistä konstruktoria, joka käyttää Androidin oletusarvoisia jakajan attribuutteja, tai toista konstruktoria, joka käyttää omaa piirrettävääsi, esimerkiksi drawable/divider.xml.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="1dp" />
<solid android:color="#ff992900" />
</shape>
Huomautus: jos haluat, että jakaja piirretään kohteiden päälle, ohita sen sijaan onDrawOver()
-metodi.
Jos haluat käyttää uutta luokkaasi, lisää VerticalSpaceItemDecoration
tai DividerSpaceItemDecoration
luokkaan RecyclerView
, esimerkiksi fragmenttisi onCreateView()
-metodissa:
private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_feed, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
//add ItemDecoration
recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
//or
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
//or
recyclerView.addItemDecoration(
new DividerItemDecoration(getActivity(), R.drawable.divider));
recyclerView.setAdapter(...);
return rootView;
}
On myös Lucas Rocha'n kirjasto, jonka on tarkoitus yksinkertaistaa esineiden koristelua. En ole tosin kokeillut sitä.
Sen ominaisuuksien joukossa ovat mm:
Saanen kiinnittää huomionne tähän tiettyyn tiedostoon Githubissa, jonka on tehnyt Alex Fu: https://gist.github.com/alexfu/0f464fc3742f134ccd1e
Se on esimerkkitiedosto DividerItemDecoration.java "pulled straight from the support demos" (https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS).
Pystyin saamaan divider-viivat hienosti tuotua tämän tiedoston projektiin ja lisätä sen item-koristeeksi kierrätysnäkymään.
Tässä'on, miten minun onCreateView näyttää minun fragmentti sisältää Recyclerview:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_recycler_view, container, false);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
return rootView;
}
Olen varma, että lisää muotoilua voidaan tehdä, mutta se on lähtökohta :)
Tämä ei oikeastaan ratkaise ongelmaa, mutta väliaikaisena kiertotapana voit asettaa kortin useCompatPadding-ominaisuuden XML-asettelussa, jotta se mittaa saman verran kuin ennen Lollipop-versioita.
card_view:cardUseCompatPadding="true"