小编ak9*_*k93的帖子

RecyclerView 项目背景可绘制不会将尺寸调整为内容大小

所以我得到了一个显示项目列表的 RecyclerView。每个项目由一个 ImageView 和两个 TextView 组成。其中一个 TextViews 显示项目的名称,该名称的长度因每个项目而异,其中一些项目可能只有一行用于此 TextView,而其他项目可能有两个或树。

大多数项目都正常显示,但有时在我滚动 RecyclerView 之前,某些项目在显示时无法正确调整大小,此时所有错误显示的项目都已正确调整大小。请参阅随附的屏幕截图:左边错误显示的项目,上下滚动后正确显示的项目

在上面的屏幕截图中,您可以看到项目的高度(或者可能只是其背景)如何低于内容高度。但是我在项目宽度方面遇到了类似的问题,其中一些项目比 RecyclerView 宽度短,但总是在项目的右侧。

这些项的背景是在xml资源中定义的可绘制形状,并通过以下方式设置在RecyclerAdapter的onBindViewHolder方法中: viewHolder.itemView.setBackground(Drawable drawable);

我的问题是,有没有人在显示大小不同的项目列表时遇到过类似的问题?[查看更新]

我在 Stackoverflow 上搜索了很多,但没有找到类似的东西。

我得出的结论是,如果问题出在适配器回收未使用的项目时,并且在使用旧的 viewholders 时没有重新测量新内容,那么必须有一种方法可以在 onBindViewHolder() 中强制它这样做。但我似乎找不到办法做到这一点。

还有一个小想法可能只是背景没有调整大小,因为项目内容确实显示了,但背景没有拉伸。

我试过(没有效果):

  1. 要设置 ViewHolder.itemView 的 layoutParams,我会将高度设置为 WRAP_CONTENT
  2. 调用 ViewHolder.itemView.requestLayout(); (如一些stackoverflow问题中所建议的)
  3. 调用 ViewHolder.itemView.invalidate();

我确实找到了一个答案,在某种程度上证实了我的假设,我需要在绑定时为项目提供内容的尺寸,即使这应该由 RecyclerView.Adapter 自动完成:https : //stackoverflow.com /a/11091945/4089261

那么我应该如何在不影响 RecyclerView 性能的情况下提供 onBindViewHolder 中每个项目的尺寸?[看更新]

这是背景的xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorListElementBackground"/>
    <stroke android:color="@color/colorListElementOutline" android:width="1dp"/>
    <corners android:radius="3dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)

这是我的适配器的来源:

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>{

    private Context mContext;
    private ArrayList<Item> mDataset;
    private int activeItemId …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

6
推荐指数
1
解决办法
1886
查看次数

Android 加密音频播放器

我将如何在音频播放器 Android 应用程序中播放一组加密的音频文件?

我有一个应用程序项目,其中将一组加密的音频内容存储在用户设备上。在这种情况下,单个音频内容(例如:播客)将包含多个加密文件。该应用程序充当音频播放器,用户通过它收听音频内容。为了获得良好的用户体验,整个内容(播客)应该从一个文件无缝播放到另一个文件。这对于使用 android 的 MediaPlayer 类的普通音频文件来说非常有效。

为了安全措施,解密的文件在任何时候都不应该出现在用户设备存储上,这样用户就可以通过我的应用程序之外的任何其他方式访问该文件(即使在 root 设备上)。

要使用的加密类型尚未确定,因此我对最适合这种情况的任何算法持开放态度。

我考虑过在播放每个文件之前对其进行解密。文件大小最大为25MB,对此类文件进行AES加密/解密大约需要300毫秒,因此不会对用户体验造成太大影响。

我在这里看到两种不同的解密方法存在两个问题:

  1. 如果我解密文件并将其作为普通音频文件存储在设备上,用户将能够访问它(已root的设备)并在我的应用程序之外使用它。
  2. 如果我解密一个文件并将其保存在系统内存中(比如说字节数组),我如何将其播放给用户?我没有找到使用 MediaPlayer 来执行此操作的方法,或者找到了任何其他可以开箱即用的库。也许可以修改某些音频流库以播放解密的文件流?

java encryption audio android

4
推荐指数
1
解决办法
4018
查看次数

Exoplayer 从字节数组播放音频 - ByteArrayDataSource

使用 Exoplayer,我试图从字节数组播放音频文件。我正在尝试使用 ByteArrayDataSource,但在调用构造函数时出现错误:new ByteArrayDataSource(data); 这是我想出的代码:

private void prepareExoPlayerFromByteArray(byte[] data){
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this, new DefaultTrackSelector(null), new DefaultLoadControl());
        exoPlayer.addListener(eventListener);


        final ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(data);

        /*
        DataSpec dataSpec = new DataSpec(byteArrayDataSource.getUri());
        try {
            byteArrayDataSource.open(dataSpec);
        } catch (IOException e) {
            e.printStackTrace();
        }
        */

        DataSource.Factory factory = new DataSource.Factory() {
            @Override
            public DataSource createDataSource() {
                return byteArrayDataSource;
            }
        };

        MediaSource audioSource = new ExtractorMediaSource(byteArrayDataSource.getUri(),
                factory, new DefaultExtractorsFactory(),null,null);
        exoPlayer.prepare(audioSource);
    }
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

E/ExoPlayerImplInternal: Internal runtime error.
                                                                                java.lang.NullPointerException
                                                                                    at com.google.android.exoplayer2.util.Assertions.checkNotNull(Assertions.java:107)
                                                                                    at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.<init>(ExtractorMediaPeriod.java:591)
                                                                                    at com.google.android.exoplayer2.source.ExtractorMediaPeriod.startLoading(ExtractorMediaPeriod.java:452)
                                                                                    at com.google.android.exoplayer2.source.ExtractorMediaPeriod.prepare(ExtractorMediaPeriod.java:165) …
Run Code Online (Sandbox Code Playgroud)

arrays audio android exoplayer

3
推荐指数
2
解决办法
3624
查看次数

MySQL JSON_OBJECT() 日期时间格式

我正在选择查询中使用 JSON_OBJECT 和 JSON_ARRAY 函数创建 JSON 结构。我遇到的问题是格式化 JSON 结果中返回日期时间列的格式。

例如我有一个表格标题

id (INT), title (VARCHAR), created_at (DATETIME)
Run Code Online (Sandbox Code Playgroud)

一行会像这样

1,"Title 1","2019-02-03 12:13:14"
Run Code Online (Sandbox Code Playgroud)

如果我现在执行以下查询

SELECT JSON_OBJECT('title',title,'created_at',created_at) AS title_json FROM titles WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

我将得到结果title_json列:

{
    "title": "Title 1",
    "created_at": "2019-02-03 12:13:14.000000"
}
Run Code Online (Sandbox Code Playgroud)

我希望以标准YYYY-MM-DD HH:ii:ss格式返回日期时间值,不带尾随零。

这可能吗?

我查看了 JSON_OBJECT 文档,但找不到任何解开这个谜团的线索。我认为所使用的格式可能是在服务器/数据库设置中的某个位置定义的。对于我的情况来说,理想的解决方案是在各个查询本身中选择设置所需的格式。

我正在使用: 服务器:MySQL Community Server (GPL) 版本:5.7.24

mysql sql

3
推荐指数
1
解决办法
5100
查看次数