Reputation: 1
I have a Recyclerview display list of mp3 files, when I click on any file the music of clicked file is start playing and when I long click on any file I change the action bar to another action bar until here everything is fine, but when I try to click the files again after entering action mode I click the files and music still playing
MyAdapter.java:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private static final String TAG = MainActivity.class.getSimpleName();
private ArrayList<RecyclerItem> listItems;
private Context mContext;
private EditText mEditText;
public boolean is_in_action_mode = false;
MainActivity mainActivity;
private onItemClickListener mListener;
private onItemLongClickListener mLongListener;
public MyAdapter(Context mContext, ArrayList<RecyclerItem> listItems) {
this.listItems = listItems;
this.mContext = mContext;
}
public interface onItemClickListener{
void onItemClick(int position);
void onMenuClick(int position, View view);
}
public void setOnItemClickListener(onItemClickListener listener){
mListener = listener;
}
public interface onItemLongClickListener{
boolean onItemLongClick(int position);
}
public void setOnItemLongClickListener(onItemLongClickListener longClickListener){
mLongListener = longClickListener;
}
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false);
ViewHolder holder = new ViewHolder(view, mListener, mLongListener);
return holder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final RecyclerItem currentItem = listItems.get(position);
holder.txtTitel.setText(currentItem.getTitle());
if (!is_in_action_mode){
is_in_action_mode = false;
} else {
is_in_action_mode = true;
}
}
@Override
public int getItemCount() {
return listItems.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public TextView txtTitel;
public TextView txtOptionDigit;
LinearLayout linearLayout ;
CardView cardView;
FrameLayout frameLayout;
MainActivity mainActivity;
public ViewHolder(@NonNull View itemView, onItemClickListener listener, onItemLongClickListener longListener) {
super(itemView);
txtTitel = (TextView) itemView.findViewById(R.id.txtTitle);
txtOptionDigit = (TextView) itemView.findViewById(R.id.txtOptionDigit);
frameLayout = (FrameLayout) itemView.findViewById(R.id.frameLayout);
frameLayout.setOnClickListener(this);
txtTitel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null){
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION){
listener.onItemClick(position);
}
}
}
});
txtTitel.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (longListener != null){
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION){
longListener.onItemLongClick(position);
}
}
return true;
}
});
txtOptionDigit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null){
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION){
listener.onMenuClick(position, view);
}
}
}
});
}
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
//when a user select or unselect a cardview this method will invoked
mainActivity.prepareSelection(v, getAdapterPosition());
}
}
public void upateAdapter(ArrayList<RecyclerItem> selection_list) {
for (RecyclerItem recyclerItem : selection_list){
listItems.remove(recyclerItem);
}
notifyDataSetChanged();
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private RecyclerView mRecyclerView; //this variable will contain the recyclerview that I created on layout
MyAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
ArrayList<RecyclerItem> mListItems = new ArrayList<>();
private MediaPlayer mMediaPlayer = new MediaPlayer();
private EditText mEditText;
ActionMode mActionMode;
int mCurrentPosition;
Toolbar mToolbar;
boolean is_in_action_mode = false;
TextView counter_text_view;
ArrayList<RecyclerItem> selection_list = new ArrayList<>();
int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
//to hide the textview counter on
counter_text_view = (TextView) findViewById(R.id.textCounter);
counter_text_view.setVisibility(View.GONE);
createDataSet();
buildRecyclerView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_activity_main, menu);
return super.onCreateOptionsMenu(menu);
}
private void createDataSet() {
File path = getExternalFilesDir("MyFolder");
File file[] = path.listFiles();
for (int i = 0; i < file.length; i++) {
mListItems.add(new RecyclerItem(file[i].getName()));
}
}
private void buildRecyclerView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
//Set adapter
mAdapter = new MyAdapter(this, mListItems);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(new MyAdapter.onItemClickListener() {
@Override
public void onItemClick(int position) {
playMusic(position);
mCurrentPosition = position;
}
@Override
public void onMenuClick(int position, View view) {
menuClicked(position, view);
}
});
mAdapter.setOnItemLongClickListener(new MyAdapter.onItemLongClickListener() {
@Override
public boolean onItemLongClick(int position) {
mAdapter.setOnItemClickListener(null);
getSupportActionBar().setTitle(null);
mToolbar.getMenu().clear();
mToolbar.inflateMenu(R.menu.menu_action_mode);
counter_text_view.setVisibility(View.VISIBLE);
is_in_action_mode = true;
mAdapter.notifyDataSetChanged();
getSupportActionBar().setDisplayHomeAsUpEnabled(true); //to display a back button on the contextual action bar
return true;
}
});
}
private void playMusic(int position) {
String path = String.valueOf(getExternalFilesDir("MyFolder"));
try{
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path + "/" + mListItems.get(position).getTitle());
mMediaPlayer.prepare();
mMediaPlayer.start();
}catch (IOException e){
//Log.v(getString(R.string.app_name),e.getMessage() );
}
}
public void prepareSelection(View view, int position){
//this method will invoked when the user select or unselect cardview
if (((FrameLayout) view).isSelected()){
//is_in_action_mode = true;
selection_list.add(mListItems.get(position));
view.setBackgroundColor(0XFF6200EE);
counter = counter + 1;
updateCounter(counter);
} else { //if the user didn't select the cardview we have to remove that item from selection list
selection_list.remove(mListItems.get(position));
counter = counter - 1;
updateCounter(counter);
}
}
public void updateCounter(int counter){
if (counter == 0) {
counter_text_view.setText("0 item selected");
} else {
counter_text_view.setText(counter + " item selected");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
if (item.getItemId() == R.id.item_delete){
//remove the selected item from the adapter
MyAdapter myAdapter = (MyAdapter) mAdapter;
myAdapter.upateAdapter(selection_list);
clearActionMode();
}
//now handle the home or back button
else if (item.getItemId() == android.R.id.home){
clearActionMode();
mAdapter.notifyDataSetChanged();
}
return true;
}
public void clearActionMode(){
is_in_action_mode = false;
//clear the menu in the toolbar
mToolbar.getMenu().clear();
mToolbar.inflateMenu(R.menu.menu_activity_main);
//remove the back button from the toolbar
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
//hide the text view (counter) from the toolbar
counter_text_view.setVisibility(View.GONE);
//update the text in the counter
counter_text_view.setText("0 item selected");
counter = 0;
selection_list.clear();
}
@Override
public void onBackPressed() {
if (is_in_action_mode){
clearActionMode();
mAdapter.notifyDataSetChanged();
} else {
super.onBackPressed();
}
}
Upvotes: 0
Views: 57
Reputation: 2817
Just put an if condition in your onClick listner like:
if(actionMode == false){
//Open music file
}else{
//Select music file (show some indicator for the selected music file like a tick or something)
}
Upvotes: 1