Recently Added

6/recent/ticker-posts

How to Create SearchView In RecyclerView in Android Studio Part 7

In this blog, I'm Going to create how you can implement SearchView In Recyclerview in Android Studio






So lets' Start



1.Create menu folder in Res and then after create menu folder create main_toolbar.xml inside menu folder
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">


<item
android:id="@+id/search"
android:icon="@drawable/search_icon"
android:title="Search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" />

<item
android:id="@+id/sortby"
android:icon="@drawable/ic_baseline_sort_24"
android:title="SortBy"
app:showAsAction="ifRoom" />

</menu>


2.Create a Toolbar inside your activity_video_flder.xml  in layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".activity.VideoFolder">

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:menu="@menu/main_toolbar"
app:title="@string/app_name"
app:titleTextColor="@color/white">


</androidx.appcompat.widget.Toolbar>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/video_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>


3. To change Searchview Textcolor just add this line inside your
themes.xml inside your default style

<item name="android:editTextColor">@color/white</item>
<item name="android:textColorHint">@color/light_white</item>
<item name="android:homeAsUpIndicator">@drawable/go_back</item>


4.Now add this code inside VideoFolder.java
package com.example.player.activity;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.player.R;
import com.example.player.VideoModel;
import com.example.player.adapter.VideosAdapter;

import java.util.ArrayList;
import java.util.Locale;

public class VideoFolder extends AppCompatActivity
implements SearchView.OnQueryTextListener {

private RecyclerView recyclerView;
private String name;
private ArrayList<VideoModel> videoModelArrayList = new ArrayList<>();
private VideosAdapter videosAdapter;
Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_folder);


recyclerView = findViewById(R.id.video_recyclerview);

name = getIntent().getStringExtra("folderName");
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(getResources().getDrawable(R.drawable.go_back));
int index = name.lastIndexOf("/");
String onlyFolderName = name.substring(index + 1);
toolbar.setTitle(onlyFolderName);
loadVideos();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_toolbar, menu);
MenuItem menuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) menuItem.getActionView();
ImageView ivClose = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
ivClose.setColorFilter(ContextCompat.getColor(getApplicationContext(), R.color.white),
android.graphics.PorterDuff.Mode.SRC_IN);
searchView.setQueryHint("Search file name");
searchView.setOnQueryTextListener(this);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onQueryTextSubmit(String query) {
return false;
}

@Override
public boolean onQueryTextChange(String newText) {
String input = newText.toLowerCase();
ArrayList<VideoModel> searchList = new ArrayList<>();
for (VideoModel model : videoModelArrayList) {
if (model.getTitle().toLowerCase().contains(input)) {
searchList.add(model);
}
}
videosAdapter.updateSearchList(searchList);

return false;
}

private void loadVideos() {
videoModelArrayList = getallVideoFromFolder(this, name);
if (name != null && videoModelArrayList.size() > 0) {
videosAdapter = new VideosAdapter(videoModelArrayList, this);
//if your recyclerview lagging then just add this line
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setNestedScrollingEnabled(false);

recyclerView.setAdapter(videosAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this,
RecyclerView.VERTICAL, false));
} else {
Toast.makeText(this, "can't find any videos", Toast.LENGTH_SHORT).show();
}

}

private ArrayList<VideoModel> getallVideoFromFolder(Context context, String name) {
ArrayList<VideoModel> list = new ArrayList<>();

Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String orderBy = MediaStore.Video.Media.DATE_ADDED + " DESC";
String[] projection = {
MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.SIZE,
MediaStore.Video.Media.HEIGHT,
MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
MediaStore.Video.Media.RESOLUTION
};
String selection = MediaStore.Video.Media.DATA + " like?";
String[] selectionArgs = new String[]{"%" + name + "%"};

Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, orderBy);

if (cursor != null) {
while (cursor.moveToNext()) {

String id = cursor.getString(0);
String path = cursor.getString(1);
String title = cursor.getString(2);
int size = cursor.getInt(3);
String resolution = cursor.getString(4);
int duration = cursor.getInt(5);
String disName = cursor.getString(6);
String bucket_display_name = cursor.getString(7);
String width_height = cursor.getString(8);

//this method convert 1204 in 1MB
String human_can_read = null;
if (size < 1024) {
human_can_read = String.format(context.getString(R.string.size_in_b), (double) size);
} else if (size < Math.pow(1024, 2)) {
human_can_read = String.format(context.getString(R.string.size_in_kb), (double) (size / 1024));
} else if (size < Math.pow(1024, 3)) {
human_can_read = String.format(context.getString(R.string.size_in_mb), (double) (size / Math.pow(1024, 2)));
} else {
human_can_read = String.format(context.getString(R.string.size_in_gb), (double) (size / Math.pow(1024, 3)));
}

//this method convert any random video duration like 1331533132 into 1:21:12
String duration_formatted;
int sec = (duration / 1000) % 60;
int min = (duration / (1000 * 60)) % 60;
int hrs = duration / (1000 * 60 * 60);

if (hrs == 0) {
duration_formatted = String.valueOf(min)
.concat(":".concat(String.format(Locale.UK, "%02d", sec)));
} else {
duration_formatted = String.valueOf(hrs)
.concat(":".concat(String.format(Locale.UK, "%02d", min)
.concat(":".concat(String.format(Locale.UK, "%02d", sec)))));
}


VideoModel files = new VideoModel(id, path, title,
human_can_read, resolution, duration_formatted,
disName, width_height);
if (name.endsWith(bucket_display_name))
list.add(files);

}
cursor.close();
}

return list;
}


}

5.Now add this code inside VideoAdapter.java
package com.example.player.adapter;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.example.player.R;
import com.example.player.VideoModel;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;

import java.io.File;
import java.util.ArrayList;

public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.MyHolder> {


private ArrayList<VideoModel> videoFolder = new ArrayList<>();
private final Context context;

public VideosAdapter(ArrayList<VideoModel> videoFolder, Context context) {
this.videoFolder = videoFolder;
this.context = context;
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.files_view, parent, false);
return new MyHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {


Glide.with(context).load(videoFolder.get(position).getPath()).into(holder.thumbnail);
holder.title.setText(videoFolder.get(position).getTitle());
holder.duration.setText(videoFolder.get(position).getDuration());
holder.size.setText(videoFolder.get(position).getSize());
holder.resolution.setText(videoFolder.get(position).getResolution());
holder.menu.setOnClickListener(v -> {
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context, R.style.BottomSheetDialogTheme);
View bottomSheetView = LayoutInflater.from(context).inflate(R.layout.file_menu, null);
bottomSheetDialog.setContentView(bottomSheetView);
bottomSheetDialog.show();
bottomSheetView.findViewById(R.id.menu_down).setOnClickListener(v1 -> {
bottomSheetDialog.dismiss();
});
bottomSheetView.findViewById(R.id.menu_share).setOnClickListener(v2 -> {
bottomSheetDialog.dismiss();
shareFile(position);
});
bottomSheetView.findViewById(R.id.menu_rename).setOnClickListener(v3 -> {
bottomSheetDialog.dismiss();
renameFiles(position, v);
});
bottomSheetView.findViewById(R.id.menu_delete).setOnClickListener(v4 -> {
bottomSheetDialog.dismiss();
deleteFiles(position, v);
});
bottomSheetView.findViewById(R.id.menu_properties).setOnClickListener(v5 -> {
bottomSheetDialog.dismiss();
showProperties(position);
});
});


}


private void shareFile(int p) {
Uri uri = Uri.parse(videoFolder.get(p).getPath());
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("video/*");
intent.putExtra(Intent.EXTRA_STREAM, uri);
context.startActivity(Intent.createChooser(intent, "share"));
Toast.makeText(context, "loading..", Toast.LENGTH_SHORT).show();
}

private void deleteFiles(int p, View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("delete")
.setMessage(videoFolder.get(p).getTitle())
.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//todo
// leave it as empty
}
}).setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
Long.parseLong(videoFolder.get(p).getId()));
File file = new File(videoFolder.get(p).getPath());
boolean deleted = file.delete();
if (deleted) {
context.getApplicationContext().getContentResolver().delete(contentUri,
null, null);
videoFolder.remove(p);
notifyItemRemoved(p);
notifyItemRangeChanged(p, videoFolder.size());
Snackbar.make(view, "File Deleted Success", Snackbar.LENGTH_SHORT).show();
} else {
Snackbar.make(view, "File Deleted Fail", Snackbar.LENGTH_SHORT).show();
}
}
}).show();
}

private void renameFiles(int position, View view) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.rename_layout);
final EditText editText = dialog.findViewById(R.id.rename_edit_text);
Button cancel = dialog.findViewById(R.id.cancel_rename_button);
Button rename_btn = dialog.findViewById(R.id.rename_button);
final File renameFile = new File(videoFolder.get(position).getPath());
String nameText = renameFile.getName();
nameText = nameText.substring(0, nameText.lastIndexOf("."));
editText.setText(nameText);
editText.clearFocus();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
cancel.setOnClickListener(v -> {
dialog.dismiss();
});
rename_btn.setOnClickListener(v1 -> {
String onlyPath = renameFile.getParentFile().getAbsolutePath();
String ext = renameFile.getAbsolutePath();
ext = ext.substring(ext.lastIndexOf("."));
String newPath = onlyPath + "/" + editText.getText() + ext;
File newFile = new File(newPath);
boolean rename = renameFile.renameTo(newFile);
if (rename) {
context.getApplicationContext().getContentResolver().
delete(MediaStore.Files.getContentUri("external"),
MediaStore.MediaColumns.DATA + "=?",
new String[]{renameFile.getAbsolutePath()});
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(newFile));
context.getApplicationContext().sendBroadcast(intent);
Snackbar.make(view, "Rename Success", Snackbar.LENGTH_SHORT).show();
} else {
Snackbar.make(view, "Rename Failed", Snackbar.LENGTH_SHORT).show();
}
dialog.dismiss();
});
dialog.show();
}

private void showProperties(int p) {
Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.file_properties);

String name = videoFolder.get(p).getTitle();
String path = videoFolder.get(p).getPath();
String size = videoFolder.get(p).getSize();
String duration = videoFolder.get(p).getDuration();
String resolution = videoFolder.get(p).getResolution();

TextView tit = dialog.findViewById(R.id.pro_title);
TextView st = dialog.findViewById(R.id.pro_storage);
TextView siz = dialog.findViewById(R.id.pro_size);
TextView dur = dialog.findViewById(R.id.pro_duration);
TextView res = dialog.findViewById(R.id.pro_resolution);

tit.setText(name);
st.setText(path);
siz.setText(size);
dur.setText(duration);
res.setText(resolution + "p");

dialog.show();

}

@Override
public int getItemCount() {
return videoFolder.size();
}

public void updateSearchList(ArrayList<VideoModel> searchList) {
videoFolder = new ArrayList<>();
videoFolder.addAll(searchList);
notifyDataSetChanged();
}


public class MyHolder extends RecyclerView.ViewHolder {
ImageView thumbnail, menu;
TextView title, size, duration, resolution;

public MyHolder(@NonNull View itemView) {
super(itemView);

thumbnail = itemView.findViewById(R.id.thumbnail);
title = itemView.findViewById(R.id.video_title);
size = itemView.findViewById(R.id.video_size);
duration = itemView.findViewById(R.id.video_duration);
resolution = itemView.findViewById(R.id.video_quality);
menu = itemView.findViewById(R.id.video_menu);
}
}
}

Watch full Tutorials

Post a Comment

0 Comments