RecyclerView 从右到左增长元素
RecyclerView Grow Element From Right to Left
我在水平方向使用RecyclerView,新元素从左到右。滚动是 ltr。如何改变这个方向?
Xml代码:
<android.support.v7.widget.RecyclerView
android:id="@+id/rc3"
android:layout_gravity="right"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
和Java:
RecyclerView rc1 = (RecyclerView) findViewById(R.id.rc1);
AdapterMainPrice mainPrice = new AdapterMainPrice(StructPrice.getThreePrice());
rc1.setHasFixedSize(false);
LinearLayoutManager llm = new LinearLayoutManager(G.context);
llm.setOrientation(LinearLayoutManager.HORIZONTAL);
rc1.setLayoutManager(llm);
rc1.setAdapter(mainPrice);
适配器:
public class AdapterMainPrice 扩展 RecyclerView.Adapter {
private List<StructPrice> prices;
public AdapterMainPrice(List<StructPrice> catList) {
this.prices = catList;
}
@Override
public int getItemCount() {
return prices.size();
}
@Override
public void onBindViewHolder(NewsViewHolder ghazaViewHolder, int position) {
StructPrice price = prices.get(position);
ghazaViewHolder.vTitle.setText(price.getProductName());
Glide.with(G.context)
.load(price.getProductPic())
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(ghazaViewHolder.Vimg);
ghazaViewHolder.cardView.startAnimation(ghazaViewHolder.animation);
}
@Override
public NewsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.adapter_item_main, viewGroup, false);
return new NewsViewHolder(itemView);
}
public static class NewsViewHolder extends RecyclerView.ViewHolder {
protected TextView vTitle;
protected ImageView Vimg;
protected Animation animation;
protected CardView cardView;
public NewsViewHolder(View v) {
super(v);
vTitle = (TextView) v.findViewById(R.id.mainRCtv);
Vimg = (ImageView) v.findViewById(R.id.mainRCimg);
animation = AnimationUtils.loadAnimation(G.context, R.anim.fadein);
cardView = (CardView) v.findViewById(R.id.mainRCCard);
}
}
非常简单,只需为您的 LayoutManager 调用 setReverseLayout(true) 即可:
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true);
layoutManager.setReverseLayout(true);
它在其文档中有解释:
/**
* Used to reverse item traversal and layout order.
* This behaves similar to the layout change for RTL views. When set to true, first item is
* laid out at the end of the UI, second item is laid out before it etc.
*
* For horizontal layouts, it depends on the layout direction.
* When set to true, If {@link android.support.v7.widget.RecyclerView} is LTR, than it will
* layout from RTL, if {@link android.support.v7.widget.RecyclerView}} is RTL, it will layout
* from LTR.
*
* If you are looking for the exact same behavior of
* {@link android.widget.AbsListView#setStackFromBottom(boolean)}, use
* {@link #setStackFromEnd(boolean)}
*/
public void setReverseLayout(boolean reverseLayout) {
assertNotInLayoutOrScroll(null);
if (reverseLayout == mReverseLayout) {
return;
}
mReverseLayout = reverseLayout;
requestLayout();
}
找到方法了,你只需要设置
linearLayoutManager.setStackFromEnd(真);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
linearLayoutManager.setStackFromEnd(true);
您可以直接从 XML 添加
通过添加 app:reverseLayout
属性:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintEnd_toStartOf="@+id/imageButton2"
app:layout_constraintTop_toTopOf="@+id/imageButton2"
app:reverseLayout="true"
tools:listitem="@layout/images_new_post_item" />
很简单!
setReverseLayout(true)
RecyclerAdapterHoTarakoneshha recyclerAdapterHoTarakoneshha = new RecyclerAdapterHoTarakoneshha(mContext, arrayList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
linearLayoutManager.setReverseLayout(true);
recyclerTarakonesh.setLayoutManager(linearLayoutManager);
recyclerTarakonesh.setHasFixedSize(true);
recyclerTarakonesh.addItemDecoration(new HorizntalSpaceItemDecoration(mContext, 10));
recyclerTarakonesh.setAdapter(recyclerAdapterHoTarakoneshha);
只需使用这个:
android:layoutDirection="rtl"
就这些了:)
使 recyclerview 中从右到左获取元素的反向布局为真,如下面给出的代码:
recycler_view.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, true)); // true is for reverse layout value
将 layoutDirection 用于 rtl 的最佳方式
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layoutDirection="rtl" />
另一种解法:
如果你想要一个水平回收视图总是从右向左滚动(不注意智能手机语言),你可以简单地扩展 LinearLayoutManager
class 并覆盖其 isLayoutRTL()
方法。
import androidx.recyclerview.widget.LinearLayoutManager;
public class RtlLinearLayoutManager extends LinearLayoutManager {
public RtlLinearLayoutManager(Context context) {
super(context);
}
public RtlLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public RtlLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected boolean isLayoutRTL() {
return true;
}
}
//...
RtlLinearLayoutManager layoutManager = new RtlLinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
注:
您也可以为 GridLayoutManager
class 执行此方案。
简单的解决方案。
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
最后一个标志应该是假的。
我在水平方向使用RecyclerView,新元素从左到右。滚动是 ltr。如何改变这个方向?
Xml代码:
<android.support.v7.widget.RecyclerView
android:id="@+id/rc3"
android:layout_gravity="right"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
和Java:
RecyclerView rc1 = (RecyclerView) findViewById(R.id.rc1);
AdapterMainPrice mainPrice = new AdapterMainPrice(StructPrice.getThreePrice());
rc1.setHasFixedSize(false);
LinearLayoutManager llm = new LinearLayoutManager(G.context);
llm.setOrientation(LinearLayoutManager.HORIZONTAL);
rc1.setLayoutManager(llm);
rc1.setAdapter(mainPrice);
适配器:
public class AdapterMainPrice 扩展 RecyclerView.Adapter {
private List<StructPrice> prices;
public AdapterMainPrice(List<StructPrice> catList) {
this.prices = catList;
}
@Override
public int getItemCount() {
return prices.size();
}
@Override
public void onBindViewHolder(NewsViewHolder ghazaViewHolder, int position) {
StructPrice price = prices.get(position);
ghazaViewHolder.vTitle.setText(price.getProductName());
Glide.with(G.context)
.load(price.getProductPic())
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(ghazaViewHolder.Vimg);
ghazaViewHolder.cardView.startAnimation(ghazaViewHolder.animation);
}
@Override
public NewsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.adapter_item_main, viewGroup, false);
return new NewsViewHolder(itemView);
}
public static class NewsViewHolder extends RecyclerView.ViewHolder {
protected TextView vTitle;
protected ImageView Vimg;
protected Animation animation;
protected CardView cardView;
public NewsViewHolder(View v) {
super(v);
vTitle = (TextView) v.findViewById(R.id.mainRCtv);
Vimg = (ImageView) v.findViewById(R.id.mainRCimg);
animation = AnimationUtils.loadAnimation(G.context, R.anim.fadein);
cardView = (CardView) v.findViewById(R.id.mainRCCard);
}
}
非常简单,只需为您的 LayoutManager 调用 setReverseLayout(true) 即可:
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true);
layoutManager.setReverseLayout(true);
它在其文档中有解释:
/**
* Used to reverse item traversal and layout order.
* This behaves similar to the layout change for RTL views. When set to true, first item is
* laid out at the end of the UI, second item is laid out before it etc.
*
* For horizontal layouts, it depends on the layout direction.
* When set to true, If {@link android.support.v7.widget.RecyclerView} is LTR, than it will
* layout from RTL, if {@link android.support.v7.widget.RecyclerView}} is RTL, it will layout
* from LTR.
*
* If you are looking for the exact same behavior of
* {@link android.widget.AbsListView#setStackFromBottom(boolean)}, use
* {@link #setStackFromEnd(boolean)}
*/
public void setReverseLayout(boolean reverseLayout) {
assertNotInLayoutOrScroll(null);
if (reverseLayout == mReverseLayout) {
return;
}
mReverseLayout = reverseLayout;
requestLayout();
}
找到方法了,你只需要设置
linearLayoutManager.setStackFromEnd(真);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
linearLayoutManager.setStackFromEnd(true);
您可以直接从 XML 添加
通过添加 app:reverseLayout
属性:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintEnd_toStartOf="@+id/imageButton2"
app:layout_constraintTop_toTopOf="@+id/imageButton2"
app:reverseLayout="true"
tools:listitem="@layout/images_new_post_item" />
很简单!
setReverseLayout(true)
RecyclerAdapterHoTarakoneshha recyclerAdapterHoTarakoneshha = new RecyclerAdapterHoTarakoneshha(mContext, arrayList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
linearLayoutManager.setReverseLayout(true);
recyclerTarakonesh.setLayoutManager(linearLayoutManager);
recyclerTarakonesh.setHasFixedSize(true);
recyclerTarakonesh.addItemDecoration(new HorizntalSpaceItemDecoration(mContext, 10));
recyclerTarakonesh.setAdapter(recyclerAdapterHoTarakoneshha);
只需使用这个:
android:layoutDirection="rtl"
就这些了:)
使 recyclerview 中从右到左获取元素的反向布局为真,如下面给出的代码:
recycler_view.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, true)); // true is for reverse layout value
将 layoutDirection 用于 rtl 的最佳方式
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layoutDirection="rtl" />
另一种解法:
如果你想要一个水平回收视图总是从右向左滚动(不注意智能手机语言),你可以简单地扩展 LinearLayoutManager
class 并覆盖其 isLayoutRTL()
方法。
import androidx.recyclerview.widget.LinearLayoutManager;
public class RtlLinearLayoutManager extends LinearLayoutManager {
public RtlLinearLayoutManager(Context context) {
super(context);
}
public RtlLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public RtlLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected boolean isLayoutRTL() {
return true;
}
}
//...
RtlLinearLayoutManager layoutManager = new RtlLinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
注:
您也可以为 GridLayoutManager
class 执行此方案。
简单的解决方案。
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
最后一个标志应该是假的。