当前位置: 首页 > 知识库问答 >
问题:

Android获取recyclerview项和位置上的selectd部分文本

景志
2023-03-14
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);
        }
    }
}

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

共有1个答案

邹涵畅
2023-03-14

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

 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();
}
 类似资料:
  • 在recyclerView中获取已点击项目的位置,我在recyclerView中创建cardview和链接 我想获取位置,将开关盒设置为每个卡视图的意向活动 当我点击card view I时,他会打开另一个页面,当你点击card view 2时,他会打开另一个页面。 看看我的密码 在recyclerView中获取已点击项目的位置,我在recyclerView中创建cardview和链接 我想获取位

  • 我有一个带有和的activity。我正在使用水平显示图像列表。当我单击中的图像时,activity中的将显示该图像的更大图片。到目前为止一切正常。 现在activity中又多了两个:和。当我单击时,中的图像应该向左转,并且中的缩略图应该反映这个变化。的情况也类似。 我可以旋转。但是,如何在中旋转缩略图呢?如何获取的? 代码: activity XML: 我的activity代码: 我得Recycl

  • 问题内容: 我正在尝试通过GPS功能获取用户的当前位置, 编写了一个实现的简单类 通过一个简单的动作,我正在访问这些经度和纬度值 但是它总是返回0.0作为结果。无法找出问题所在。 问题答案: 您必须在onCreate()返回之后才能触发您的位置更新回调。如果您将经纬度变量初始化为虚拟值,则可能会看到您正在打印这些值。 在onLocationChanged中添加一些日志记录,以便可以看到它已被触发,

  • 问题内容: 我有一个与和一起进行的活动。我正在使用来水平显示图像列表。当我点击在图像上的在活动中应显示图像的大局观。到目前为止,一切正常。 现在,活动中还有两个:和。当我单击时,中的图像应左移,并且中的缩略图也应反映此更改。与的情况类似。 我能够旋转。但是,如何旋转缩略图?我如何获得的? 码: 活动XML: 我的活动代码: 我的RecyclerView自定义适配器: 问题答案: 我想您正在使用a

  • 如何在中获取当前项?在我的用例中,RV项占用了所有屏幕空间,因此一次只有一个项。我以前试过谷歌,但没有找到任何有用的东西。