【问题标题】:RecyclerView Grow Element From Right to LeftRecyclerView 从右到左增长元素
【发布时间】:2015-10-22 02:37:57
【问题描述】:

我在水平方向使用 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);

适配器:

公共类 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);
    }


}

【问题讨论】:

标签: android android-recyclerview right-to-left


【解决方案1】:

这很简单,只需为您的 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();
}

【讨论】:

    【解决方案2】:

    就用这个吧:

    android:layoutDirection="rtl"
    

    就是这样:)

    【讨论】:

      【解决方案3】:

      知道怎么做,你要做的就是设置

      linearLayoutManager.setStackFromEnd(true);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
                      linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
                      linearLayoutManager.setStackFromEnd(true);
      

      【讨论】:

        【解决方案4】:

        您可以直接从 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" />
        

        【讨论】:

          【解决方案5】:

          使用 layoutDirection 到 rtl 的最佳方式

          <android.support.v7.widget.RecyclerView
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layoutDirection="rtl" />
          

          【讨论】:

          • 它是在 API 级别 17 中添加的,即 4.2,因此旧版本不支持它,顺便说一下它在 API 级别 17 上的工作
          【解决方案6】:

          另一种解决方案:

          如果你想拥有一个总是从右到左滚动(不注意智能手机语言)的水平回收视图,你可以简单地扩展LinearLayoutManager类并覆盖它的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 类执行此方案。

          【讨论】:

            【解决方案7】:

            很简单!

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

            【讨论】:

              【解决方案8】:

              为了在 recyclerview 中从右到左获取元素,使反向布局为真,如下所示:

               recycler_view.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, true));  // true is for reverse layout value
              

              【讨论】:

                【解决方案9】:

                简单的解决方案。

                RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
                

                最后一个标志应该是假的。

                【讨论】:

                  猜你喜欢
                  • 2011-08-02
                  • 1970-01-01
                  • 2011-10-07
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-02-01
                  • 2023-03-07
                  • 2018-11-29
                  • 2014-03-21
                  相关资源
                  最近更新 更多