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选择文本不是我的问题,在用户和行位置选择文本后,我无法获取文本的选定部分