所以我得到了一个显示项目列表的 RecyclerView。每个项目由一个 ImageView 和两个 TextView 组成。其中一个 TextViews 显示项目的名称,该名称的长度因每个项目而异,其中一些项目可能只有一行用于此 TextView,而其他项目可能有两个或树。
大多数项目都正常显示,但有时在我滚动 RecyclerView 之前,某些项目在显示时无法正确调整大小,此时所有错误显示的项目都已正确调整大小。请参阅随附的屏幕截图:
在上面的屏幕截图中,您可以看到项目的高度(或者可能只是其背景)如何低于内容高度。但是我在项目宽度方面遇到了类似的问题,其中一些项目比 RecyclerView 宽度短,但总是在项目的右侧。
这些项的背景是在xml资源中定义的可绘制形状,并通过以下方式设置在RecyclerAdapter的onBindViewHolder方法中: viewHolder.itemView.setBackground(Drawable drawable);
我的问题是,有没有人在显示大小不同的项目列表时遇到过类似的问题?[查看更新]
我在 Stackoverflow 上搜索了很多,但没有找到类似的东西。
我得出的结论是,如果问题出在适配器回收未使用的项目时,并且在使用旧的 viewholders 时没有重新测量新内容,那么必须有一种方法可以在 onBindViewHolder() 中强制它这样做。但我似乎找不到办法做到这一点。
还有一个小想法可能只是背景没有调整大小,因为项目内容确实显示了,但背景没有拉伸。
我试过(没有效果):
我确实找到了一个答案,在某种程度上证实了我的假设,我需要在绑定时为项目提供内容的尺寸,即使这应该由 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 的 MediaPlayer 类的普通音频文件来说非常有效。
为了安全措施,解密的文件在任何时候都不应该出现在用户设备存储上,这样用户就可以通过我的应用程序之外的任何其他方式访问该文件(即使在 root 设备上)。
要使用的加密类型尚未确定,因此我对最适合这种情况的任何算法持开放态度。
我考虑过在播放每个文件之前对其进行解密。文件大小最大为25MB,对此类文件进行AES加密/解密大约需要300毫秒,因此不会对用户体验造成太大影响。
我在这里看到两种不同的解密方法存在两个问题:
使用 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) 我正在选择查询中使用 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