安卓水平滚动的RecyclerView滚动方向

74

我创建了一个水平的RecyclerView,它能够正常工作(感谢这个),但滚动和数据的方向是从左到右扩展的;那么我该如何像下面的图片一样改变RecyclerView的滚动方向?

enter image description here

我的代码:

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

14个回答

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

例如:

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

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


1
是的,根据传递给构造函数的标志,滚动条将会改变。非常感谢! - GvSharma

48

只需使用 XML 即可实现。

app: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" />

1
谢谢,但 XML 在我的情况下不起作用,因为我的代码中有这个:StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager( 2, //网格中的列数 LinearLayoutManager.HORIZONTAL); - Hamid Goodarzi
1
谢谢。对于正常方向,请设置 app:reverseLayout="false" - CoolMind
对于正常的方向,您可以直接忽略这行 - Lucas Ferraz
1
对于 AndroidX,可以使用 app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - iCantC

39

使用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">

编辑

使用reverseLayout属性改变滚动方向。

app:reverseLayout="true"

(感谢 @Mostafa Imani 提供)


1
这需要使用AndroidX。对于支持库,请使用app:layoutManager="android.support.v7.widget.LinearLayoutManager" - CoolMind
1
是啊,那又怎样?使用androidx有什么问题吗? - Shadab K
但它仍然默认向左滚动,有没有办法使其从右向左滚动? - Mostafa Imani
1
app:reverseLayout="true" 是答案。 - Mostafa Imani

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

有许多方法可以创建水平的RecyclerView。

在Android中创建水平RecyclerView的4种方法


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类

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

2
在Recycler布局管理器中,第二个参数是spanCount。增加或减少span count将改变在您的屏幕上显示的元素数量。"span count"翻译成"跨度计数"可能更容易理解。所以可以这样翻译:在 Recycler 布局管理器中,第二个参数是跨度计数,增加或减少跨度计数将改变您屏幕上显示的元素数量。
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2, //The number of Columns in the grid
,GridLayoutManager.HORIZONTAL,false);
                recyclerView.setLayoutManager(mLayoutManager);

1

在片段中尝试以下代码:

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

mRecyclerView.setLayoutManager(layoutManager);

1
这段代码足够了。
RecyclerView recyclerView;
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,true);

 recyclerView.setLayoutManager(layoutManager);

1

只需添加两行代码即可使RecyclerView的方向为水平方向。因此,在初始化RecyclerView时添加以下这些行。

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

my_recycler.setLayoutManager(linearLayoutManager);

1
//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'

2
你能否请在你的回答中添加一些解释? - dan1st

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接