Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android获取recyclerview项目和位置上文本的选定部分_Android - Fatal编程技术网

Android获取recyclerview项目和位置上文本的选定部分

Android获取recyclerview项目和位置上文本的选定部分,android,Android,在我的适配器项目中,可以选择显示弹出窗口,如copy、cut等,现在如何在recyclerView项目和位置上获取所选部分文本?我阅读了更多关于找到此解决方案的文档,但我不知道如何才能做到这一点 这是我的适配器,我想获取文本和帖子的选定部分: public class ShowBookContentsAdapter extends RecyclerView.Adapter<ShowBookContentsAdapter.ShowBookContentsViewHolder> {

在我的适配器项目中,可以选择显示弹出窗口,如
copy
cut
等,现在如何在
recyclerView
项目和位置上获取所选部分文本?我阅读了更多关于找到此解决方案的文档,但我不知道如何才能做到这一点

这是我的适配器,我想获取文本和帖子的选定部分:

public class ShowBookContentsAdapter extends RecyclerView.Adapter<ShowBookContentsAdapter.ShowBookContentsViewHolder> {
    private List<Contents> list;
    private Context        context;

    ...

    private fontFace setFontFace = fontFace.SHABNAM;

    public ShowBookContentsAdapter(List<Contents> items, Context mContext, IonChangeBottomViewVisibility mOnChangeBottomViewVisibility, IonSelectText mIonSelectText) {
        list = items;
        context = mContext;

        ionChangeBottomViewvisibility = mOnChangeBottomViewVisibility;
        ionSelectText = mIonSelectText;
    }

    @Override
    public ShowBookContentsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int layout = -1;
        switch (viewType) {
            case 0:
                layout = R.layout.item_book_content_paragraph;
                break;
        }

        view = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
        holder = new ShowBookContentsViewHolder(view);

        return holder;
    }

    @Override
    public void onBindViewHolder(ShowBookContentsViewHolder holder, final int position) {
        switch (list.get(position).getContentType()) {
            case 0:
                makeSelectable(holder.book_content_paragraph);
                implementingParagraphView(holder, position);
                break;
        }
    }

    private void implementingParagraphView(final ShowBookContentsViewHolder mHolder, final int position) {
        holder = mHolder;

        String content = list.get(position).getContent();
        mHolder.book_content_paragraph.removeAllViews();
        try {
            Reader reader = new StringReader(content);

            KetabkhanView         ketabkhan             = new KetabkhanView(context);
            KetabkhanTagProcessor ketabkhanTagProcessor = new KetabkhanTagProcessor();

            ketabkhanTagProcessor.parse(reader, ketabkhan);
            mHolder.book_content_paragraph.addView(ketabkhan);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("E ", e.getMessage());
            throw new RuntimeException(e);
        }

        makeSelectable(mHolder.book_content_paragraph);

        if (setFontFace == fontFace.SHABNAM)
            Utils.overrideFonts(context, mHolder.book_content_paragraph, PersianFontType.SHABNAM);
        else if (setFontFace == fontFace.SAHEL)
            Utils.overrideFonts(context, mHolder.book_content_paragraph, PersianFontType.SAHEL);

        //for show and hide bottom view
        mHolder.book_content_paragraph.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ionChangeBottomViewvisibility != null) {
                    ionChangeBottomViewvisibility.onChange();
                }
            }
        });
    }

    ...
    private void makeSelectable(ViewGroup viewGroup) {
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof ViewGroup) {
                makeSelectable((ViewGroup) child);
            } else if (child instanceof TextView) {
                ((TextView) child).setTextIsSelectable(true);
                ((TextView) child).setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize == 0 ? 14 : textSize);
            }
        }
    }

    @Override
    public int getItemViewType(int position) {
        return list.get(position).getContentType();
    }

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

    public int getItemPosition(int itemId) {
        return itemPositions.get(itemId);
    }

    public void setData(List<Contents> mContents) {
        list.clear();
        list.addAll(mContents);
    }

    public class ShowBookContentsViewHolder extends RecyclerView.ViewHolder {
        @Nullable
        @BindView(R.id.book_content_paragraph)
        LinearLayout book_content_paragraph;

        ...
        public ShowBookContentsViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}
公共类ShowBookContentsAdapter扩展了RecyclerView.Adapter{
私人名单;
私人语境;
...
私有fontFace setFontFace=fontFace.SHABNAM;
公共ShowBookContentsAdapter(列表项、上下文mContext、IonChangeBottomViewVisibility mOnChangeBottomViewVisibility、IonSelectText mIonSelectText){
列表=项目;
上下文=mContext;
ionChangeBottomViewvisibility=mOnChangeBottomViewVisibility;
ionSelectText=mIonSelectText;
}
@凌驾
公共ShowBookContentsViewHolder onCreateViewHolder(视图组父级,int-viewType){
int布局=-1;
开关(视图类型){
案例0:
布局=R.layout.item\u book\u content\u段落;
打破
}
view=LayoutInflater.from(parent.getContext()).flate(layout,parent,false);
holder=新的ShowBookContentsViewHolder(视图);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(ShowBookContentsViewHolder,最终int位置){
开关(list.get(position.getContentType()){
案例0:
可选择(书夹、书内容、段落);
实施段落视图(支架、位置);
打破
}
}
私有void实现段落视图(最终ShowBookContentsViewHolder mHolder,最终int位置){
持有人=mHolder;
String content=list.get(position.getContent();
mHolder.book_content_段落.removeallview();
试一试{
阅读器=新的StringReader(内容);
ketabkhan视图ketabkhan=新的ketabkhan视图(上下文);
KetabkhanTagProcessor KetabkhanTagProcessor=新的KetabkhanTagProcessor();
parse(reader,ketabkhan);
mHolder.book\u content\u段落.addView(ketabkhan);
}捕获(例外e){
e、 printStackTrace();
Log.e(“e”,e.getMessage());
抛出新的运行时异常(e);
}
可选择(mHolder.book\u内容\u段落);
if(setFontFace==fontFace.SHABNAM)
Utils.overrideFonts(上下文,mHolder.book\u content\u段落,PersianFontType.SHABNAM);
else if(setFontFace==fontFace.SAHEL)
Utils.overrideFonts(上下文,mHolder.book\u content\u段落,PersianFontType.SAHEL);
//用于显示和隐藏底部视图
mHolder.book\u content\u段落.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(ionChangeBottomViewvisibility!=null){
ionChangeBottomViewvisibility.onChange();
}
}
});
}
...
私有void可选择(视图组视图组){
对于(int i=0;i

我通过以下方法在项目上创建可选文本:
makeselectible()

我已经使用自定义ActionMode回调实现了相同的功能。通过在recyclerView适配器的onBindViewHolder中设置textview.customSelectionActionModeCallback,我们可以将自定义操作模式回调设置为recycler视图项的特定textview。在自定义回调中,我们可以使用当前位置和所选文本。 onBindViewHolder将如下所示

 public void onBindViewHolder(myViewHolder holder, int position) {
    //code
    holder.textview. setCustomSelectionActionModeCallback(new CustomSelectionCallback(holder.taskName, position, mContext));
}

在自定义回调中,我们可以发送任何内容以及项目的位置。 自定义选择回调可以按如下方式实现

public class CustomSelectionCallback implements ActionMode.Callback {

private TextView mTextView;
private int position;
private Context mContext;

public CustomSelectionCallback(TextView text, int pos, Context context) {
    this.mTextView = text;
    this.position = pos;
    this.mContext = context;
}

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    int start = mTextView.getSelectionStart();
    int end = mTextView.getSelectionEnd();
    Spannable wordtoSpan = (Spannable) mTextView.getText();
    wordtoSpan.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    //copy the text when Copy Action Mode is clicked
    if (item.getItemId() == android.R.id.copy) {
        copyText(start, end);
        mode.finish();
        return true;
    } else if (item.getItemId() == android.R.id.shareText) {
        shareText(start, end);
        mode.finish();
        return true;
    } else if (item.getItemId() == android.R.id.selectAll) {
        selectAllText();
        return true;
    }
    return true;

}

/**
 * implement select all functionality id ActionMOde Menu
 */
private void selectAllText() {
    Selection.setSelection((Spannable) mTextView.getText(), 0, mTextView.length());
}

private void shareText(int start, int end) {
    CharSequence selectedTxt = mTextView.getText().subSequence(start, end);
    String shareBody = selectedTxt.toString();
    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.setType("text/plain");
    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
    mContext.startActivity(Intent.createChooser(sharingIntent, "SHARE"));
}

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    return true;
}

@Override
public void onDestroyActionMode(ActionMode mode) {
}

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

/**
 * copy the selected text with start and end param to clipboard
 *
 * @param start start point of selection of the text view
 * @param end   end point of selection of the text view
 */
private void copyText(int start, int end) {
    ClipboardManager clipboardManager = (ClipboardManager) mContext.
            getSystemService(Context.CLIPBOARD_SERVICE);

    CharSequence selectedTxt = mTextView.getText().subSequence(start, end);
    ClipData clipData = ClipData.newPlainText("selected text label", selectedTxt);
    assert clipboardManager != null;
    clipboardManager.setPrimaryClip(clipData);
    Toast.makeText(mContext, selectedTxt.toString() + "   position  " + position, Toast.LENGTH_LONG).show();
}

}

您是否尝试将android:textIsSelectable选项添加到textView?@abdulrahmank选择文本不是我的问题,在用户和行位置选择文本后,我无法获取文本的选定部分