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

2024-04-17

在我的适配器中,可以选择显示弹出窗口的项目,例如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);
        }
    }
}

我通过这种方法在项目上制作可选择的文本:makeSelectable()


我已经使用自定义 ActionMode 回调实现了相同的功能。我们可以通过设置将自定义操作模式回调设置为回收器视图项的特定文本视图textView.customSelectionActionModeCallback在recyclerViewAdapter的onBindViewHolder中。在自定义回调中,我们可以使用当前位置和选定的文本。 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();
}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • SQL - 转换日期时间格式

    我尝试更改 MySQL 上的日期时间格式 T 得到了一个包含一些列的历史表 其中一些列都具有这种格式 DATETIME JJ MM AAAA HH MM 我需要更改为 AAAA MM JJ HH MM SS 我没有 SS 的变量 我想取 0
  • 最小 SDK 版本/目标 SDK 版本与编译 SDK 版本有什么区别?

    最小sdk版本 目标sdk版本 和 编译sdk版本 有什么区别 我知道 min 和 target sdk 是什么意思 但是编译 sdk 版本是什么意思 在 Eclipse 中 我有最小 最大和目标 sdk 但在 android studio
  • Facebook Open Graph 未显示在时间线上

    我在我的应用程序中使用 FB Open Graph 它没有完全发挥作用 当我发布一个对象时 它会出现在用户最近的活动中 然而 它并没有出现在他们的时间表上 元数据没有错误 我正在使用 FBGraph gem 但当我使用curl 执行此操作时
  • SQL 中将月份编号转换为月份名称函数

    我在 SQL Server 中存储了月份 1 2 3 4 12 我想将它们显示为一月 二月等 SQL Server 中是否有类似 MonthName 1 January 的函数 如果可能的话 我试图避免使用 CASE 语句 我认为这是获得月
  • 如何在 Qt5 中创建/读取/写入 JSON 文件

    Qt5 有一个新的 JSON 解析器 我想使用它 问题在于 用外行术语来说 这些函数的作用以及如何用它编写代码并不太清楚 否则我可能读错了 我想知道在 Qt5 中创建 JSON 文件的代码以及 封装 的含义 示例 从文件中读取 json t
  • XML 文本提取

    设想 给定以下 XML 文件
  • python 3 打印生成器

    当我处理 print 函数 Python 3 时出现问题 当我寻找一系列的总和时 我可能会使用以下代码模式 gt gt gt sum i for i in range 101 但是当我倾向于检查我制作的系列时 我选择 print 并假设它会
  • 智能表,onclick事件

    是否可以在智能表上处理 onClick 事件 我已经注释了来自后端的数据 单击某个条目时 我想导航到一个新视图 显示与我单击的条目关联的所有数据 我怎样才能在 SAPUI5 中实现这一点 我可以在 JavaScript 控制器中使用 get
  • React Navigation - 从选项卡栏打开模式

    使用 React Navigation 6 我将底部选项卡设置为我的主导航器 export function TabNavigator const getColor focused color gt focused palette blue
  • 404 尝试将 Ocelot 中的上游路径路由到下游路径

    我在将传入的 http 请求转发到下游路径时遇到此警告 错误 Ocelot DownstreamRouteFinder Middleware DownstreamRouteFinderMiddleware 警告 requestId 8000
  • SAPUI5 oTable 一行作为链接,其他作为文本视图

    目前我有一个 sapui 表 我希望其中一行是链接 所有其他行应该是文本视图 我的问题是 构建表是基于列 oTable addColumn new sap ui table Column label new sap ui commons L
  • vue.js 中的 $http.get() 与 axios.get() 有什么区别?

    我有点困惑理解之间的主要区别 http get and axios get 我查阅了很多资源 但没有得到满意的答案 有人可以帮我吗 http 是一个全局变量 可能是您在 vuejs 项目中定义的 请在您的项目中搜索 http 您可能会发现它
  • 如何在运行时知道 POJO 的 ID (@GenerateValue)

    我有一个表格可以填写 POJO 名为Father 在里面 我有一个FotoFather field 当我保存一个新的 Father 时 我会自动保存 FotoFather 对象 使用 Hibernate ORM 模式 FotoFather
  • 扫描 iPhone 范围内的蓝牙设备需要多长时间?

    我知道 iPhone 蓝牙功能要到 3 0 才能通过 SDK 访问 但是需要多长时间才能找到该区域的设备 它取决于该区域的设备数量吗 如果范围内有大约 5 个设备 扫描发现所有设备是否需要花费 30 秒的时间 我知道有很多未知因素 但我试图
  • 如何设置 pygame.transform.rotate() 的枢轴点(旋转中心)?

    我想围绕中心以外的点旋转矩形 到目前为止我的代码是 import pygame pygame init w 640 h 480 degree 45 screen pygame display set mode w h surf pygame
  • Xdebug v3.0.2 与 PHP v8.0.0

    我刚刚使用 XAMPP v3 2 4 迁移到 php v8 0 0 但 Xdebug 不起作用 执行不会在断点处停止 我的安装说明 Download php xdebug 3 0 2 8 0 vs16 x86 64 dll Move the
  • Symfony:解析 web.xml 时出现 InvalidArgumentException

    最近 我将 Symfony 系统移动到另一台服务器 从那时起就出现错误 技术细节是 Windows Server 2012 上的 apache 2 4 服务器 apache可以通过本地网络访问的文件服务器 当我移动 Symfony 页面时
  • ERC721:转账调用者不是所有者也不是批准的

    我有一个 nftToken 合约 可以将代币铸造到 msg sender 然后我在市场合约中有一个函数 可以将 nft 从所有者转移到市场合约 但是 我收到一条错误消息 ERC721 转账调用者不是所有者也不是批准的 这是我的 nftCon
  • ReplaceAll 性能秘诀是什么? [HTML 转义]

    我花了一些时间寻找转义 html 字符串的最佳方法 并发现了一些相关讨论 讨论1 https stackoverflow com questions 24816 escaping html strings with jquery 讨论2 h
  • Android获取recyclerview项目和位置上选定的文本部分

    在我的适配器中 可以选择显示弹出窗口的项目 例如copy cut或等等 现在我怎样才能获得所选的文本部分recyclerView项目和位置 我阅读了更多有关找到此解决方案的文档 但我不知道该怎么做 这是我的适配器 我想获取文本和位置的选定部