导航抽屉碎片中的RecylcerView无法检测触摸事件

时间:2016-02-29 18:13:03

标签: android android-fragments android-recyclerview drawer android-navigation-drawer

我正在尝试实现在片段中使用RecyclerView的导航抽屉。除了检测触摸事件外,一切正常。在RecyclerView触摸侦听器和ViewHolder的触摸侦听器中都没有检测到任何触摸。

我知道与使用新材料设计指南中的NavigationView相比,这种方法可能已经过时,但我仍然想知道我在这里做错了什么。

所有帮助表示赞赏!

DrawerFragment:

public class DrawerFragment extends Fragment {

private DrawerAdapter mDrawerAdapter;
private RecyclerView mDrawerList;
private FragmentDrawerListener mDrawerListener;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private Context mContext;
private View mContainerView;

public DrawerFragment(){

}

public interface FragmentDrawerListener {
    public void onDrawerItemSelected(View view, int position);
}

public void setDrawerListener(FragmentDrawerListener listener) {
    this.mDrawerListener = listener;
}

private List<DrawerItem> getDrawerItems(){
    List<DrawerItem> drawerItems = new ArrayList<>();
    String[] titles = mContext.getResources().getStringArray(R.array.nav_drawer_items);
    TypedArray icons = mContext.getResources().obtainTypedArray(R.array.nav_drawer_icons);

    for (int i = 0; i < titles.length; i++) {
        DrawerItem drawerItem = new DrawerItem(titles[i],icons.getResourceId(i, -1));
        drawerItems.add(drawerItem);
    }

    return drawerItems;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.drawer_layout,container,false);

    mDrawerList = (RecyclerView) layout.findViewById(R.id.drawer_list);
    mDrawerAdapter = new DrawerAdapter(getActivity(),getDrawerItems());
    mDrawerList.setAdapter(mDrawerAdapter);
    mDrawerList.setLayoutManager(new LinearLayoutManager(getActivity()));
    mDrawerList.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), mDrawerList,new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            mDrawerListener.onDrawerItemSelected(view, position);
            mDrawerLayout.closeDrawer(mContainerView);
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

    return layout;
}


public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) {
    mContainerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            toolbar.setAlpha(1 - slideOffset / 2);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });
}

public static interface ClickListener {
    public void onClick(View view, int position);
    public void onLongClick(View view, int position);
}


static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}
}

的活动:

public class MainActivity extends AppCompatActivity implements DrawerFragment.FragmentDrawerListener {
private static final String TAG = "MainActivity";

private Toolbar mToolbar;
private DrawerFragment mDrawerFragment;

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

    initToolbar();
    initDrawer();
}

private void initToolbar() {
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

private void initDrawer() {
    mDrawerFragment = (DrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
    mDrawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar);
    mDrawerFragment.setDrawerListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onDrawerItemSelected(View view, int position) {
    Log.i(TAG,"Stuff selected!");
}
}

适配器:

public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.DrawerItemHolder> {
private Context mContext;
private List<DrawerItem> mDrawerItems;

public DrawerAdapter(Context context, List<DrawerItem> drawerItems) {
    this.mContext = context;
    this.mDrawerItems = drawerItems;
}

@Override
public DrawerItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.nav_item,parent,false);
    DrawerItemHolder drawerItemHolder = new DrawerItemHolder(view);
    return drawerItemHolder;
}

@Override
public void onBindViewHolder(DrawerItemHolder holder, int position) {
    holder.mTitle.setText(mDrawerItems.get(position).getTitle());
    holder.mIcon.setImageResource(mDrawerItems.get(position).getIcon());
}

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

static class DrawerItemHolder extends RecyclerView.ViewHolder {
    TextView mTitle;
    ImageView mIcon;

    public DrawerItemHolder(View itemView) {
        super(itemView);
        mTitle = (TextView) itemView.findViewById(R.id.title);
        mIcon = (ImageView) itemView.findViewById(R.id.icon);
    }
}

}

布局文件:

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:orientation="vertical">

    <include
        android:id="@+id/toolbar"
        layout="@layout/tool_bar"/>

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

<fragment
    android:id="@+id/fragment_navigation_drawer"
    android:name="com.raicky.example.ui.fragments.DrawerFragment"
    android:layout_width="@dimen/nav_drawer_width"
    android:layout_height="match_parent"
    android:layout_marginTop="@dimen/abc_action_bar_default_height_material"
    android:layout_gravity="start"
    app:layout="@layout/drawer_layout"
    tools:layout="@layout/drawer_layout" />

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

0 个答案:

没有答案