RecyclerView行项目触摸列表器

时间:2015-10-30 12:32:43

标签: android multi-select android-recyclerview

对于RecyclerView中的多选,我使用了以下Project

现在我面临两个问题:

  • 即使RecyclerView为空并且您长按ActionMode,ActionBar的行为也会像选择行项目一样。
  • 以下是行项Row Item RecyclerView,OnClick of Location图标地图应该会打开。但问题是,如果我点击地图图标,它会获得Row的点击事件以及地图图标。

在行上单击我打开不同的片段和点击地图图标我打开地图片段。

片段代码:

 @Override
    public void onClick(View v) {
        if (v.getId() == R.id.root_row_item) {
            int idx = mRecyclerView.getChildPosition(v);
            if (actionMode != null) {
                myToggleSelection(idx);
                return;
            } else {
                int pos = idx;
                Intent intent = new Intent(getActivity(), OtherActivity.class);
                intent.putExtra(ContactDetailFragment.KEY_CONTACT_DP, getUserDpFromDB(mCallLogBeanList.get(pos).getNumber()));
                intent.putExtra(ContactDetailFragment.KEY_CONTACT_NAME, mCallLogBeanList.get(pos).getName());
                intent.putExtra(ContactDetailFragment.KEY_CONTACT_NUMBER, mCallLogBeanList.get(pos).getNumber());
                startActivity(intent);

            }

        }
    }
    private void myToggleSelection(int idx) {
    mContactsAdapter.toggleSelection(idx);
    String title = getString(R.string.selected_count, mContactsAdapter.getSelectedItemCount());
    actionMode.setTitle(title);
}

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.menu_delete, menu);
    return true;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case R.id.menu_delete:
            List<Integer> selectedItemPositions = mContactsAdapter.getSelectedItems();
            int currPos;
            for (int i = selectedItemPositions.size() - 1; i >= 0; i--) {
                currPos = selectedItemPositions.get(i);
                //                    RecyclerViewDemoApp.removeItemFromList(currPos);
                deleteCallLogsFromDB(currPos);

            }
            mode.finish();
            return true;
        default:
            return false;
    }
}


@Override
public void onDestroyActionMode(ActionMode actionMode) {
    this.actionMode = null;
    mContactsAdapter.clearSelections();
}

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    gestureDetector.onTouchEvent(e);
    return false;
}

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

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    public void onFragmentInteraction(Uri uri);
}

//==============================================================================================
private class RecyclerViewGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        try {
            View view = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
            onClick(view);
        } catch (NullPointerException ne) {
            Log.e("NullPointerException", ne.getMessage());
        }

        return super.onSingleTapConfirmed(e);
    }

    public void onLongPress(MotionEvent e) {
        View view = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
        if (actionMode != null) {
            return;
        }

        AppCompatActivity aca = (AppCompatActivity) getActivity();
        actionMode = aca.startSupportActionMode(TabCallLogFragment.this);
        int idx = mRecyclerView.getChildAdapterPosition(view);
        myToggleSelection(idx);
        super.onLongPress(e);
    }
}

适配器部分:

@Override
    public void onBindViewHolder(ListItemViewHolder viewHolder, int position) {
        holder.Location.setTag(position);
        holder.Location.setOnClickListener(this);
}

0 个答案:

没有答案