我在Recyclerview(https://github.com/lsjwzh/RecyclerViewPager)的一项中添加了RecyclerViewPager
我想在触摸RecyclerView时滚动它。

我试过了 :

    View.OnTouchListener listener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                case MotionEvent.ACTION_DOWN:
                    mRecyclerViewPager.requestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    mRecyclerViewPager.requestDisallowInterceptTouchEvent(false);
                    break;
            }
            return false;
        }
    };
    mRecyclerView.setOnTouchListener(listener);

但是我有时只能滚动RecyclerView。

我认为可以通过在NestedScrollingParent中实现RecyclerViewPager或在onTouchEvent中更改RecyclerViewPager来实现,但是我对它们并不熟悉。

android-recyclerview - 在RecyclerViewPager中添加Recyclerview-LMLPHP

最佳答案

我遵循了使用Github documentation.配置和创建简单示例的步骤

主要 Activity XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.stackoverflow.recyclerviewstack.MainActivity">

    <com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="1dp"
        android:paddingRight="1dp"
        app:rvp_triggerOffset="0.1"
        app:rvp_singlePageFling="true"
        android:clipToPadding="false"
        />
</RelativeLayout>

主要 Activity 课
package com.stackoverflow.recyclerviewstack;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;

import com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager;

public class MainActivity extends AppCompatActivity {

    RecyclerAdapter mAdapter;
    RecyclerViewPager mRecycler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecycler = (RecyclerViewPager) findViewById(R.id.list);

        // setLayoutManager like normal RecyclerView, you do not need to change any thing.
        LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecycler.setLayoutManager(layout);

        //set adapter
        //You just need to implements ViewPageAdapter by yourself like a normal RecyclerView.Adpater.
        mAdapter = new RecyclerAdapter(ItemListGenerator.generateCollection(15, "OutItem "));
        mRecycler.setAdapter(mAdapter);
    }
}

回收适配器
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    List<String> collection;

    public RecyclerAdapter(List<String> collection) {
        this.collection = collection;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView item;
        RecyclerView mInnerRecycler;

        public ViewHolder(View view) {
            super(view);
            item = (TextView) view.findViewById(R.id.title);
            mInnerRecycler = (RecyclerView) view.findViewById(R.id.innerRecycler);
            LinearLayoutManager layout = new LinearLayoutManager(view.getContext(),
                                                    LinearLayoutManager.HORIZONTAL, false);
            mInnerRecycler.setLayoutManager(layout);
            mInnerRecycler.setAdapter(new InnerAdapter());
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(R.layout.outer_collection, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(position < 0 || position > getItemCount()) return;

        String itemString = collection.get(position);
        holder.item.setText(itemString);

    }

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

RecyclerViewPager用于创建ViewHolder的布局

ViewHolder使用布局 outside_collection :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip"
        android:layout_margin="2dip"
        android:background="@color/colorPrimary"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/innerRecycler"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

内部适配器
public class InnerAdapter extends RecyclerView.Adapter<InnerAdapter.ViewHolder> {


    List<String> collection;

    public InnerAdapter() {
        this.collection = ItemListGenerator.generateCollection(15, "Inner ");
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView item;

        public ViewHolder(View itemView) {
            super(itemView);
            item = (TextView) itemView.findViewById(R.id.item);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(R.layout.simple_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if(position < 0 || position > getItemCount()) return;
        holder.item.setText(collection.get(position));
    }

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

提示

对于RecyclerViewPager,我使用了以下方向:
 LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

对于其中的RecyclerView:
LinearLayoutManager layout = new LinearLayoutManager(view.getContext(), LinearLayoutManager.HORIZONTAL, false);

如果在PagerView中使用VERTICAL,则可以在水平集合中导航或将PagerView方向更改为HORIZONTAL,并且可以在VERTICAL方向上滚动内部项目。

您必须评估如何使用它。我希望这段代码可以帮助您解决问题,并重新考虑您的设计。可能不是一个好习惯,或者UX对两个容器使用相同的方向。我不是UX专家。

我想提供更多帮助。

关于android-recyclerview - 在RecyclerViewPager中添加Recyclerview,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36587228/

10-11 00:15