#java #android #android-recyclerview
#java #Android #android-recyclerview
Вопрос:
В моем recyclerview
адаптере у меня есть два типа представления native ad view type
и пункт меню, в моем адаптере ниже я получаю следующую ошибку.
java.lang.ClassCastException: java.util.ArrayList не может быть преобразован в модель.VideoListModel в адаптере.MainListAdapter.onBindViewHolder(MainListAdapter.java:95)
и строка 95
final VideoListModel folderVideoModel = (VideoListModel) arrayList.get(position);
вот мой адаптер RecyclerView
public class MainListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int MENU_ITEM_VIEW_TYPE = 0;
private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
private final Context mContext;
private final ArrayList<Object> arrayList;
public MainListAdapter(Context context, ArrayList<Object> arrayList) {
this.mContext = context;
this.arrayList = arrayList;
}
public static class MainAdapterViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView duration;
Chip size;
RelativeLayout path;
ImageView thumbnail;
public MainAdapterViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
duration = itemView.findViewById(R.id.duration);
size = itemView.findViewById(R.id.file_size);
path = itemView.findViewById(R.id.item_path);
thumbnail = itemView.findViewById(R.id.thumbnail);
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
@Override
public int getItemViewType(int position) {
Object recyclerViewItem = arrayList.get(position);
if (recyclerViewItem instanceof UnifiedNativeAd) {
return UNIFIED_NATIVE_AD_VIEW_TYPE;
}
return MENU_ITEM_VIEW_TYPE;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
switch (viewType) {
case UNIFIED_NATIVE_AD_VIEW_TYPE:
View unifiedNativeLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ad_unified, viewGroup, false);
return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);
case MENU_ITEM_VIEW_TYPE:
default:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_video_list, viewGroup, false);
return new MainAdapterViewHolder(view);
}
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case UNIFIED_NATIVE_AD_VIEW_TYPE:
UnifiedNativeAd nativeAd = (UnifiedNativeAd) arrayList.get(position);
populateNativeAdView(nativeAd, ((UnifiedNativeAdViewHolder) holder).getAdView());
break;
case MENU_ITEM_VIEW_TYPE:
default:
final MainAdapterViewHolder mainAdapterViewHolder = (MainAdapterViewHolder) holder;
final VideoListModel folderVideoModel = (VideoListModel) arrayList.get(position);
mainAdapterViewHolder.title.setText("" folderVideoModel.getPath());
mainAdapterViewHolder.thumbnail.setImageResource(R.drawable.ic_folder);
break;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private final ArrayList<NormalFile> list = new ArrayList<>();
private final List<VideoListModel> models = new ArrayList<>();
private final Map<String, VideoListModel> files = new HashMap<>();
private DbHelper db;
MainListAdapter adapter;
private final FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
List<Object> arrayListVideos = new ArrayList<>();
List<UnifiedNativeAd> nativeAds = new ArrayList<>();
public static final int NUMBER_OF_ADS = 1;
AdLoader adLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = Constants.getDbHelper(this);
loadVideos();
RecyclerView recyclerView = findViewById(R.id.main_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MainListAdapter(this, arrayListVideos);
recyclerView.setAdapter(adapter);
}
private void loadVideos() {
FileFilter.getFiles(this, new FilterResultCallback<NormalFile>() {
@Override
public void onResult(List<Directory<NormalFile>> directories) {
for (Directory<NormalFile> directory : directories) {
list.addAll(directory.getFiles());
for (int i = 0; i < directory.getFiles().size(); i ) {
File f = new File(directory.getFiles().get(i).getPath());
String parent = Objects.requireNonNull(f.getParent()).substring(f.getParent().lastIndexOf("/") 1);
if (parent.equals("0")) {
VideoListModel vlm = new VideoListModel();
vlm.setFolder(false);
vlm.setFile(f);
vlm.setPath(f.getPath());
vlm.setDuration("");
models.add(vlm);
} else {
if (files.containsKey(parent)) {
VideoListModel vlm = files.get(parent);
assert vlm != null;
vlm.getFiles().add(f);
vlm.setPath(f.getParent());
} else {
VideoListModel vlm = new VideoListModel();
vlm.setFolder(true);
vlm.setFolderName(parent);
vlm.setPath(f.getParent());
List<File> fileList = new ArrayList<>();
fileList.add(f);
vlm.setFiles(fileList);
files.put(parent, vlm);
}
}
}
}
models.addAll(files.values());
arrayListVideos.add(models);
for (int i = 0; i < models.size(); i ) {
Log.d("TAG", "onResult: " models.get(i).getPath() " 2 " models.get(i).isFolder());
}
adapter.notifyDataSetChanged();
//sortByName();
new ThumbnailLoader().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new TimeAndSizeLoader().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
getSupportLoaderManager().destroyLoader(3);
}
}, new String[]{"mp4", "mov", "wmv", "avi", "avchd", "webm", "m4v", "mkv", "3gp", "3g2", "flv", "m3u8"});
}
@SuppressLint("StaticFieldLeak")
private class TimeAndSizeLoader extends AsyncTask<Void, Integer, Void> {
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
adapter.notifyItemChanged(values[0]);
}
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i < models.size(); i ) {
if(models.get(i).getFile() != null){
FileStore fs = db.getFileByName(models.get(i).getFile().getName());
VideoListModel vlm = models.get(i);
if (fs != null) {
if(fs.getDuration() != null){ // for file
vlm.setDuration(fs.getDuration());
}else {
fs.setDuration(Constants.getDuration(vlm.getFile().getPath()));
vlm.setDuration(fs.getDuration());
db.insertOrUpdateFile(fs);
}
}else {
vlm.setDuration(Constants.getDuration(vlm.getFile().getPath()));
FileStore fss = new FileStore();
fss.setName(vlm.getFile().getName());
fss.setParent(vlm.getFile().getParent());
fss.setUpdatedAt(new Date());
db.insertOrUpdateFile(fss);
models.set(i, vlm);
}
publishProgress(i);
}
}
Log.e("size", db.getFiles().size() "");
return null;
}
}
@SuppressLint("StaticFieldLeak")
private class ThumbnailLoader extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
adapter.notifyDataSetChanged();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
adapter.notifyDataSetChanged();
}
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i < models.size(); i ) {
if(models.get(i).getFile() != null){
FileStore fs = db.getFileByName(models.get(i).getFile().getName());
VideoListModel vlm = models.get(i);
if (fs != null) {
if(fs.getBitmap() != null){
vlm.setBitmap(BitmapFactory.decodeByteArray(fs.getBitmap(), 0, fs.getBitmap().length));
vlm.setWidth(fs.getWidth());
vlm.setHeight(fs.getHeight());
}else {
mmr.setDataSource(models.get(i).getFile().getPath());
Bitmap bmp = mmr.getFrameAtTime((Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)) / 2) * 1000, OPTION_CLOSEST_SYNC);
bmp = Constants.resize(bmp, 512, 512);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
vlm.setBitmap(bmp);
fs.setBitmap(byteArray);
fs.setWidth(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)));
fs.setHeight(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)));
vlm.setWidth(fs.getWidth());
vlm.setHeight(fs.getHeight());
db.insertOrUpdateFile(fs);
}
}else {
try {
mmr.setDataSource(models.get(i).getFile().getPath());
Log.e("time", mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
//vlm.setDuration(Constants.getDurationByLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)));
//models.set(i, vlm);
//publishProgress(i);
Bitmap bmp = mmr.getFrameAtTime((Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)) / 2) * 1000, OPTION_CLOSEST_SYNC);
bmp = Constants.resize(bmp, 512, 512);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
vlm.setBitmap(bmp);
FileStore fss = new FileStore();
fss.setName(vlm.getFile().getName());
fss.setParent(vlm.getFile().getParent());
fss.setBitmap(byteArray);
fss.setWidth(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)));
fss.setHeight(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)));
fss.setUpdatedAt(new Date());
vlm.setWidth(fss.getWidth());
vlm.setHeight(fss.getHeight());
db.insertOrUpdateFile(fss);
models.set(i, vlm);
}catch (Exception ignored){ }
}
publishProgress(i);
}
}
Log.e("db", db.getFiles().size() "");
return null;
}
}
private void loadNativeAds() {
AdLoader.Builder builder = new AdLoader.Builder(this,getResources().getString(R.string.native_ad_id));
adLoader = builder.forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
@Override
public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
nativeAds.add(unifiedNativeAd);
if (!adLoader.isLoading()) {
insertAdsInMenuItem();
}
}
}).withAdListener(new AdListener() {
@Override
public void onAdFailedToLoad(int i) {
super.onAdFailedToLoad(i);
if (!adLoader.isLoading()) {
insertAdsInMenuItem();
}
}
}).build();
adLoader.loadAds(new AdRequest.Builder().build(),NUMBER_OF_ADS);
}
private void insertAdsInMenuItem() {
if (nativeAds.size() < 0 ){
return;
}
int offset = (models.size() / nativeAds.size() 1 );
int index = 0;
for (UnifiedNativeAd ad:nativeAds){
arrayListVideos.add(index, ad);
index = index offset;
}
}
}
}
VideoListModel
общедоступный класс VideoListModel { частная логическая папка; частное значение int fileCount; ширина частного значения int; высота частного значения int; имя_фоЛьда частной строки; длительность частной строки; путь к частной строке; частный файл file; частное растровое изображение bitmap; файлы закрытого списка;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public boolean isFolder() {
return folder;
}
public void setFolder(boolean folder) {
this.folder = folder;
}
public int getFileCount() {
return fileCount;
}
public void setFileCount(int fileCount) {
this.fileCount = fileCount;
}
public String getFolderName() {
return folderName;
}
public void setFolderName(String folderName) {
this.folderName = folderName;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
}
я добавил Model
, но все равно получаю сообщение об ошибке. Так какую же ошибку я совершил ?
Комментарии:
1. Возможно, вы передали ArrayList, например ArrayList<ArrayList>, в adapter constractor
2. @mostafa3dmax нет, вот как я прошел
ArrayList<Object> arrayListVideos = new ArrayList<>();
3. Добавьте свой код действия, в котором вы создаете экземпляр своего адаптера и RecyclerView
4. @mostafa3dmax я обновил свой код.
5. Я думаю, что ваш код действия неверен! Как вы прошли
List<VideoListModel> models
public MainListAdapter(Context context, ArrayList<Object> arrayList)
?MainListAdapter
Подрядчик получаетArrayList<Object>
в качестве вторых параметров, поэтому вы не можете передать егоList<VideoListModel>
! Я думаю, вы передалиArrayList<Object> arrayListVideos
егоMainListAdapter
подрядчику. и в вашемonResult
методе вы передалиmodels
это ArrayList вarrayListVideos
:arrayListVideos.add(models);
Ответ №1:
public class MainListSuperClass {
}
Создайте класс MyUnifiedNativeAd :
public class MyUnifiedNativeAd extends MainListSuperClass{
private UnifiedNativeAd mUnifiedNativeAd;
public MyUnifiedNativeAd(UnifiedNativeAd unifiedNativeAd) {
mUnifiedNativeAd = unifiedNativeAd;
}
public UnifiedNativeAd getUnifiedNativeAd() {
return mUnifiedNativeAd;
}
public void setUnifiedNativeAd(UnifiedNativeAd unifiedNativeAd) {
mUnifiedNativeAd = unifiedNativeAd;
}
}
расширить VideoListModel из MainListSuperClass :
public class VideoListModel extends MainListSuperClass{
...
}
Код адаптера :
public class MainListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int MENU_ITEM_VIEW_TYPE = 0;
private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
private final Context mContext;
private final ArrayList<MainListSuperClass> arrayList;
public MainListAdapter(Context context, ArrayList<MainListSuperClass> arrayList) {
this.mContext = context;
this.arrayList = arrayList;
}
public static class MainAdapterViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView duration;
Chip size;
RelativeLayout path;
ImageView thumbnail;
public MainAdapterViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
duration = itemView.findViewById(R.id.duration);
size = itemView.findViewById(R.id.file_size);
path = itemView.findViewById(R.id.item_path);
thumbnail = itemView.findViewById(R.id.thumbnail);
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
@Override
public int getItemViewType(int position) {
MainListSuperClass recyclerViewItem = arrayList.get(position);
if (recyclerViewItem instanceof MyUnifiedNativeAd) {
return UNIFIED_NATIVE_AD_VIEW_TYPE;
}
return MENU_ITEM_VIEW_TYPE;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
switch (viewType) {
case UNIFIED_NATIVE_AD_VIEW_TYPE:
View unifiedNativeLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ad_unified, viewGroup, false);
return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);
case MENU_ITEM_VIEW_TYPE:
default:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_video_list, viewGroup, false);
return new MainAdapterViewHolder(view);
}
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case UNIFIED_NATIVE_AD_VIEW_TYPE:
UnifiedNativeAd nativeAd = ((MyUnifiedNativeAd) arrayList.get(position)).getUnifiedNativeAd();
populateNativeAdView(nativeAd, ((UnifiedNativeAdViewHolder) holder).getAdView());
break;
case MENU_ITEM_VIEW_TYPE:
default:
final MainAdapterViewHolder mainAdapterViewHolder = (MainAdapterViewHolder) holder;
final VideoListModel folderVideoModel = (VideoListModel) arrayList.get(position);
mainAdapterViewHolder.title.setText("" folderVideoModel.getPath());
mainAdapterViewHolder.thumbnail.setImageResource(R.drawable.ic_folder);
break;
}
}
Активный код :
public class MainActivity extends AppCompatActivity {
private final ArrayList<NormalFile> list = new ArrayList<>();
private final Map<String, VideoListModel> files = new HashMap<>();
private DbHelper db;
MainListAdapter adapter;
private final FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
List<MainListSuperClass> arrayListVideos = new ArrayList<>();
List<MyUnifiedNativeAd> nativeAds = new ArrayList<>();
public static final int NUMBER_OF_ADS = 1;
AdLoader adLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = Constants.getDbHelper(this);
loadVideos();
RecyclerView recyclerView = findViewById(R.id.main_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MainListAdapter(this, arrayListVideos);
recyclerView.setAdapter(adapter);
}
private void loadVideos() {
FileFilter.getFiles(this, new FilterResultCallback<NormalFile>() {
@Override
public void onResult(List<Directory<NormalFile>> directories) {
for (Directory<NormalFile> directory : directories) {
list.addAll(directory.getFiles());
for (int i = 0; i < directory.getFiles().size(); i ) {
File f = new File(directory.getFiles().get(i).getPath());
String parent = Objects.requireNonNull(f.getParent()).substring(f.getParent().lastIndexOf("/") 1);
if (parent.equals("0")) {
VideoListModel vlm = new VideoListModel();
vlm.setFolder(false);
vlm.setFile(f);
vlm.setPath(f.getPath());
vlm.setDuration("");
arrayListVideos.add(vlm);
} else {
if (files.containsKey(parent)) {
VideoListModel vlm = files.get(parent);
assert vlm != null;
vlm.getFiles().add(f);
vlm.setPath(f.getParent());
} else {
VideoListModel vlm = new VideoListModel();
vlm.setFolder(true);
vlm.setFolderName(parent);
vlm.setPath(f.getParent());
List<File> fileList = new ArrayList<>();
fileList.add(f);
vlm.setFiles(fileList);
files.put(parent, vlm);
}
}
}
}
arrayListVideos.addAll(files.values());
for (int i = 0; i < arrayListVideos.size(); i ) {
Log.d("TAG", "onResult: " arrayListVideos.get(i).getPath() " 2 " arrayListVideos.get(i).isFolder());
}
adapter.notifyDataSetChanged();
//sortByName();
new ThumbnailLoader().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new TimeAndSizeLoader().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
getSupportLoaderManager().destroyLoader(3);
}
}, new String[]{"mp4", "mov", "wmv", "avi", "avchd", "webm", "m4v", "mkv", "3gp", "3g2", "flv", "m3u8"});
}
@SuppressLint("StaticFieldLeak")
private class TimeAndSizeLoader extends AsyncTask<Void, Integer, Void> {
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
adapter.notifyItemChanged(values[0]);
}
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i < arrayListVideos.size(); i ) {
if(arrayListVideos.get(i).getFile() != null){
FileStore fs = db.getFileByName(arrayListVideos.get(i).getFile().getName());
VideoListModel vlm = arrayListVideos.get(i);
if (fs != null) {
if(fs.getDuration() != null){ // for file
vlm.setDuration(fs.getDuration());
}else {
fs.setDuration(Constants.getDuration(vlm.getFile().getPath()));
vlm.setDuration(fs.getDuration());
db.insertOrUpdateFile(fs);
}
}else {
vlm.setDuration(Constants.getDuration(vlm.getFile().getPath()));
FileStore fss = new FileStore();
fss.setName(vlm.getFile().getName());
fss.setParent(vlm.getFile().getParent());
fss.setUpdatedAt(new Date());
db.insertOrUpdateFile(fss);
arrayListVideos.set(i, vlm);
}
publishProgress(i);
}
}
Log.e("size", db.getFiles().size() "");
return null;
}
}
@SuppressLint("StaticFieldLeak")
private class ThumbnailLoader extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
adapter.notifyDataSetChanged();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
adapter.notifyDataSetChanged();
}
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i < arrayListVideos.size(); i ) {
if(arrayListVideos.get(i).getFile() != null){
FileStore fs = db.getFileByName(arrayListVideos.get(i).getFile().getName());
VideoListModel vlm = arrayListVideos.get(i);
if (fs != null) {
if(fs.getBitmap() != null){
vlm.setBitmap(BitmapFactory.decodeByteArray(fs.getBitmap(), 0, fs.getBitmap().length));
vlm.setWidth(fs.getWidth());
vlm.setHeight(fs.getHeight());
}else {
mmr.setDataSource(arrayListVideos.get(i).getFile().getPath());
Bitmap bmp = mmr.getFrameAtTime((Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)) / 2) * 1000, OPTION_CLOSEST_SYNC);
bmp = Constants.resize(bmp, 512, 512);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
vlm.setBitmap(bmp);
fs.setBitmap(byteArray);
fs.setWidth(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)));
fs.setHeight(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)));
vlm.setWidth(fs.getWidth());
vlm.setHeight(fs.getHeight());
db.insertOrUpdateFile(fs);
}
}else {
try {
mmr.setDataSource(arrayListVideos.get(i).getFile().getPath());
Log.e("time", mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION));
//vlm.setDuration(Constants.getDurationByLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)));
//arrayListVideos.set(i, vlm);
//publishProgress(i);
Bitmap bmp = mmr.getFrameAtTime((Long.parseLong(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION)) / 2) * 1000, OPTION_CLOSEST_SYNC);
bmp = Constants.resize(bmp, 512, 512);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
vlm.setBitmap(bmp);
FileStore fss = new FileStore();
fss.setName(vlm.getFile().getName());
fss.setParent(vlm.getFile().getParent());
fss.setBitmap(byteArray);
fss.setWidth(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)));
fss.setHeight(Integer.parseInt(mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)));
fss.setUpdatedAt(new Date());
vlm.setWidth(fss.getWidth());
vlm.setHeight(fss.getHeight());
db.insertOrUpdateFile(fss);
arrayListVideos.set(i, vlm);
}catch (Exception ignored){ }
}
publishProgress(i);
}
}
Log.e("db", db.getFiles().size() "");
return null;
}
}
private void loadNativeAds() {
AdLoader.Builder builder = new AdLoader.Builder(this,getResources().getString(R.string.native_ad_id));
adLoader = builder.forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
@Override
public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
nativeAds.add((new MyUnifiedNativeAd(unifiedNativeAd));
if (!adLoader.isLoading()) {
insertAdsInMenuItem();
}
}
}).withAdListener(new AdListener() {
@Override
public void onAdFailedToLoad(int i) {
super.onAdFailedToLoad(i);
if (!adLoader.isLoading()) {
insertAdsInMenuItem();
}
}
}).build();
adLoader.loadAds(new AdRequest.Builder().build(),NUMBER_OF_ADS);
}
private void insertAdsInMenuItem() {
if (nativeAds.size() < 0 ){
return;
}
int offset = (arrayListVideos.size() / nativeAds.size() 1 );
int index = 0;
for (MyUnifiedNativeAd ad:nativeAds){
arrayListVideos.add(index, ad);
index = index offset;
}
}
}
}
Комментарии:
1. у меня нет класса
UnifiedNativeAd
. И у меня естьVideoListModel
файл add class2. создайте класс, который расширяет
UnifiedNativeAd
likeMyUnifiedNativeAd extends UnifiedNativeAd
иMyUnifiedNativeAd
MainListSuperClass
implementate, и изменитеMainListSuperClass
тип на interface3. можете ли вы опубликовать код, как это должно быть сделано. полный код..
4. Я отредактировал свой код. Сначала проверьте, не является ли UnifiedNativeAd окончательным, и вы можете расширить его
5. У вас его нет, но можете ли вы расширить его?