【问题标题】:Android Horizontal RecyclerView scroll DirectionAndroid水平RecyclerView滚动方向
【发布时间】:2016-10-10 12:50:35
【问题描述】:

我制作了一个 Horizo​​ntal RecyclerView,它工作正常(感谢this),但滚动方向和数据从左到右展开;那么如何更改 RecyclerView 的滚动方向,如下图所示?

我的代码:

StaggeredGridLayoutManager staggeredGridLayoutManager =
                new StaggeredGridLayoutManager(
                        2, //The number of Columns in the grid
                        LinearLayoutManager.HORIZONTAL);

【问题讨论】:

标签: android android-recyclerview horizontal-scrolling


【解决方案1】:

假设您在 RecyclerView 中使用 LinearLayoutManager,那么您可以在 LinearLayoutManager 构造函数中将 true 作为第三个参数传递。

例如:

mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));

如果您使用的是StaggeredGridLayoutManager,那么您可以使用它提供的setReverseLayout 方法。

【讨论】:

  • 是的,根据在构造函数中传递的标志,滚动会改变。非常感谢!
【解决方案2】:

您只需使用 xml 即可。

应用程序:reverseLayout="true" 完成工作!

<android.support.v7.widget.RecyclerView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:divider="@null"
  android:orientation="horizontal"
  app:reverseLayout="true" />

【讨论】:

  • 谢谢;但在我的情况下,xml 将不起作用,因为在我的代码中: StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager( 2, //网格中的列数 LinearLayoutManager.HORIZONTAL);
  • 谢谢。对于法线方向设置app:reverseLayout="false".
  • 正常方向可以省略这一行
  • 对于AndroidX,app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
【解决方案3】:

使用 androidx 的 XML 方法:

<androidx.recyclerview.widget.RecyclerView
  android:layout_width="match_parent"
  android:id="@+id/my_recycler_view"
  android:orientation="horizontal"
  tools:listitem="@layout/my_item"
  app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 
  android:layout_height="wrap_content">

【讨论】:

  • 这需要 AndroidX。对于支持库,请使用app:layoutManager="android.support.v7.widget.LinearLayoutManager"
  • 是吗?使用androidx有什么问题
【解决方案4】:

带有 imageview 和 textview 的水平 RecyclerView

xml文件

main.xml

<LinearLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_marginTop="5dp"
   android:orientation="vertical"
   android:background="#070e94">
<View
    android:background="#787878"
    android:layout_width="match_parent"
    android:layout_height="1dp"
    />
<android.support.v7.widget.RecyclerView
    android:id="@+id/wallet"
    android:background="#070e94"
    android:layout_width="match_parent"
    android:layout_height="100dp"/>

item.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_marginTop="5dp">
<ImageView
    android:id="@+id/image"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:scaleType="fitXY"
    android:src="@drawable/bus"
    android:layout_gravity="center"/>
<TextView
    android:textColor="#000"
    android:textSize="12sp"
    android:layout_gravity="center"
    android:padding="5dp"
    android:id="@+id/txtView"
    android:textAlignment="center"
    android:hint="Electronics"
    android:layout_width="80dp"
    android:layout_height="wrap_content" />

Java 类

ActivityMaim.java

public class MainActivity extends AppCompatActivity{
private  RecyclerView  horizontal_recycler_view;
private ArrayList<Arraylist> horizontalList;
private CustomAdapter horizontalAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    horizontal_recycler_view= (RecyclerView) findViewById(R.id.horizontal_recycler_view);
    horizontalList = new ArrayList<Arraylist>();
    for (int i = 0; i < MyData.nameArray.length; i++) {
        horizontalList.add(new Arraylist(
                MyData.nameArray[i],
                MyData.drawableArray[i]
        ));
    }
    horizontalAdapter=new CustomAdapter(horizontalList);
    LinearLayoutManager horizontalLayoutManagaer
            = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
    horizontal_recycler_view.setLayoutManager(horizontalLayoutManagaer);
    horizontal_recycler_view.setAdapter(horizontalAdapter);
}}

适配器类

CustomAdapter.java

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

private ArrayList<Arraylist> dataSet;

public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView textViewName;

    ImageView imageViewIcon;

    public MyViewHolder(View itemView) {
        super(itemView);
        this.textViewName = (TextView) itemView.findViewById(R.id.txtView);
        //this.textViewVersion = (TextView) itemView.findViewById(R.id.textViewVersion);
        this.imageViewIcon = (ImageView) itemView.findViewById(R.id.image);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                if (getPosition()==0)
                {
                    Toast.makeText(v.getContext(), " On CLick one", Toast.LENGTH_SHORT).show();

                } if (getPosition()==1)
                {
                    Toast.makeText(v.getContext(), " On CLick Two", Toast.LENGTH_SHORT).show();

                } if (getPosition()==2)
                {
                    Toast.makeText(v.getContext(), " On CLick Three", Toast.LENGTH_SHORT).show();

                } if (getPosition()==3)
                {
                    Toast.makeText(v.getContext(), " On CLick Fore", Toast.LENGTH_SHORT).show();

                }

            }
        });
    }
}

public CustomAdapter(ArrayList<Arraylist> data) {
    this.dataSet = data;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                       int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view, parent, false);

    //view.setOnClickListener(MainActivity.myOnClickListener);

    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

    TextView textViewName = holder.textViewName;
   // TextView textViewVersion = holder.textViewVersion;
    ImageView imageView = holder.imageViewIcon;

    textViewName.setText(dataSet.get(listPosition).getName());
    //textViewVersion.setText(dataSet.get(listPosition).getVersion());
    imageView.setImageResource(dataSet.get(listPosition).getImage());
}

@Override
public int getItemCount() {
    return dataSet.size();
}}

Arraylist.java

public class Arraylist{
String name;
int image;

public Arraylist(String name, int image) {
    this.name = name;
    this.image=image;
}
public String getName() {
    return name;
}
public int getImage() {
    return image;
}}

MyData.java

public class MyData {
static String[] nameArray = {"Gas", "Insurance", "Electronics", "Other Services"};
static Integer[] drawableArray = {R.drawable.gas_gas, R.drawable.insurance, R.drawable.electric, R.drawable.services};}

【讨论】:

    【解决方案5】:

    你可以使用改变滑动的方向

    reverselayout 属性 = true。

    在 Kotlin 中,

    val layoutManager = LinearLayoutManager(this@MainActivity,LinearLayoutManager.HORIZONTAL,true)
    recyclerview.layoutManager = layoutManager

    在 Java 中,

     LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true);
     recyclerview.setLayoutManager(layoutManager);
    

    实际上它颠倒了布局。

    如果显示如下

    1.2..3....10

    它会变成

    10.9..8....1

    创建Horizo​​ntal RecyclerView有很多方法。

    4 Ways To Create Horizontal RecyclerView In Android

    【讨论】:

      【解决方案6】:

      在 Recycler 布局管理器中,第二个参数是 spanCount 增加或减少跨度计数将改变屏幕上显示的元素数量

          RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2, //The number of Columns in the grid
      ,GridLayoutManager.HORIZONTAL,false);
                      recyclerView.setLayoutManager(mLayoutManager);
      

      【讨论】:

        【解决方案7】:

        只需添加两行代码即可使recyclerview 的方向为水平。所以在初始化 Recyclerview 时添加这些行。

          LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        
        my_recycler.setLayoutManager(linearLayoutManager);
        

        【讨论】:

          【解决方案8】:

          下面这段代码就够了

          RecyclerView recyclerView;
          LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,true);
          
           recyclerView.setLayoutManager(layoutManager);
          

          【讨论】:

            【解决方案9】:

            在片段中试试这个:

            layoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL,false);
            
            mRecyclerView.setLayoutManager(layoutManager);
            

            【讨论】:

              【解决方案10】:

              试试这个

              我已经尝试了以上所有答案,它向我展示了相同的垂直回收器视图,所以我尝试了另一个示例。

              1. 初始化适配器

                private Adapter mAdapter;
                
              2. 这样设置适配器

                mAdapter = new Adapter();
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
                recycler_view.setLayoutManager(linearLayoutManager);
                recycler_view.setAdapter(mAdapter);
                

              希望这也对你有用 完整代码请参考this链接

              【讨论】:

                【解决方案11】:

                这是关于波斯语的问题, 只需要旋转您的 ListView、GridView 或 ....,然后旋转您的单元格。 您可以在 xml android:rotate="360" 中执行此操作。

                【讨论】:

                  【解决方案12】:
                  //in fragment page: 
                  
                   recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity(), HORIZONTAL,true));
                  
                  //this worked for me but before that please import :
                  
                  implementation 'com.android.support:recyclerview-v7:28.0.0'
                  

                  【讨论】:

                  • 您能否为您的答案添加一些解释?
                  【解决方案13】:
                  For Horizontal Scroolview in RecyclerView in Kotlin: - We use this Code 
                   recycler_upcoming.layoutManager =
                              LinearLayoutManager(sContext, LinearLayoutManager.HORIZONTAL, false)
                          recycler_upcoming.adapter =
                              InboxUpcomingAdapter(this@InboxMessageFragment, arrayList, sContext)
                  
                  -> sContext mean Ur Context
                  -> If you pass false then scroll right to left
                  -> If You pass true then scroll left to right
                  

                  【讨论】:

                    【解决方案14】:

                    您的 XML 设计在这里 &lt;androidx.recyclerview.widget.RecyclerView android:id="@+id/rvPopularPerson" android:layout_width="match_parent" android:layout_height="215dp"/&gt;

                    记住首先要修复 recyclerview 的高度,例如 100dp、200dp、300dp 等。

                    Java 代码在这里recyclerView= view.findViewById(R.id.rvPopularPerson); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity(), LinearLayoutManager.HORIZONTAL, false));

                    我想它会对你有所帮助。

                    【讨论】:

                      猜你喜欢
                      • 2018-10-01
                      • 1970-01-01
                      • 2016-10-26
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多