Фильтр поиска в представлении списка возвращает неверный результат при нажатии

#java #android #xml #android-studio #android-layout

Вопрос:

Проблема Я создаю музыкальный плеер с помощью Android studio. Все было хорошо, пока я не добавил фильтр поиска для поиска песен. Фильтр поиска возвращает правильную песню, но когда я нажимаю на результат поиска, открывается неправильный музыкальный файл, однако название музыки, отображаемое в активности проигрывателя, правильное, но каждый раз воспроизводимая песня является первой песней в списке . Пример Есть 4 элемента песни с именами: A,B,C,D При поиске C отображается отфильтрованный результат C. Но при нажатии на нее отображается название песни C, но воспроизводится песня A.

Это действительно расстраивает.

Главная Activity.java

 package com.example.musicplayer2;

import android.Manifest;
import android.content.Intent;
import android.icu.text.Transliterator;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SearchEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;

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

public class MainActivity extends AppCompatActivity {

    static boolean shuffleBol = false;
    static boolean loopBol = false;


    ListView listView;
    String[] items;
    ArrayAdapter<String> myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = findViewById(R.id.listViewSong);
        runtimePermission();

    }


    public void runtimePermission()
    {

        Dexter.withContext(this).withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                        displaySongs();
                    }

                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {

                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {

                        permissionToken.continuePermissionRequest();
                    }
                }).check();

    }


    public ArrayList<File> findSong(File file)
    {
        ArrayList<File> arrayList = new ArrayList<>();

        File[] files = file.listFiles();
        if (files != null){

            for (File singlefile : files)
            {
                if (singlefile.isDirectory() amp;amp; !singlefile.isHidden())
                {
                    arrayList.addAll(findSong(singlefile));
                }

                else
                {
                    if (singlefile.getName().endsWith(".mp3") amp;amp; !singlefile.getName().startsWith("."))
                    {
                        arrayList.add(singlefile);
                    }
                }
            }
        }

        return arrayList;
    }



    void displaySongs()
    {
        ArrayList<File> mysongs;
        mysongs = findSong(Environment.getExternalStorageDirectory());

        items = new String[mysongs.size()];

        for (int i=0; i < mysongs.size(); i  )
        {
            items[i] = mysongs.get(i).getName().replace(".mp3","");

        }

//        ArrayAdapter<String> myAdapter;
        myAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, items);
        listView.setAdapter(myAdapter);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String songName = (String) listView.getItemAtPosition(position);
                startActivity(new Intent(getApplicationContext(),PlayerActivity.class)
                .putExtra("songs",mysongs)
                .putExtra("songname",songName)
                .putExtra("position",position));
            }
        });


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu,menu);

        MenuItem menuItem = menu.findItem(R.id.search_view);

        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                myAdapter.getFilter().filter(newText);
                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }



}
 

главная activity.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context=".MainActivity">


    <ListView
        android:id="@ id/listViewSong"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@android:color/transparent"
        android:dividerHeight="10.0sp"
        android:padding="8dp"
        >

    </ListView>

</RelativeLayout>
 

PlayerActivity.java

 package com.example.musicplayer2;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

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

import static com.example.musicplayer2.MainActivity.loopBol;
import static com.example.musicplayer2.MainActivity.shuffleBol;

public class PlayerActivity extends AppCompatActivity {

    ImageView btnplay,btnnext,btnprev,btnshuffle,btnloop;
    TextView txtsname,txtstart,txtstop;
    SeekBar seekmusic;

    String sname;

    public static final String EXTRA_NAME = "song_name";
    static MediaPlayer mediaPlayer;
    int position;
    ArrayList<File> mySongs;

    Thread updateseekbar;

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

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Player");


        btnprev = findViewById(R.id.btnprev);
        btnnext = findViewById(R.id.btnnext);
        btnplay = findViewById(R.id.playbtn);
        btnshuffle = findViewById(R.id.btnshuffle);
        btnloop = findViewById(R.id.btnloop);


        txtsname = findViewById(R.id.txtsn);
        txtstart = findViewById(R.id.txtstart);
        txtstop = findViewById(R.id.txtstop);

        seekmusic = findViewById(R.id.seekbar);




//        if a media player is already running then.
        if (mediaPlayer != null)
        {
            mediaPlayer.stop();
            mediaPlayer.release();
        }

        Intent i = getIntent();
        Bundle bundle = i.getExtras();

        mySongs = (ArrayList)bundle.getParcelableArrayList("songs");
        String songName = i.getStringExtra("songname");
        position = bundle.getInt("position",0);
        txtsname.setSelected(true);

        Uri uri = Uri.parse(mySongs.get(position).toString());
        sname = mySongs.get(position).getName();
        txtsname.setText(sname);

        mediaPlayer = MediaPlayer.create(getApplicationContext(),uri);
        mediaPlayer.start();

        updateseekbar = new Thread()
        {
            @Override
            public void run() {
                int totalDuration = mediaPlayer.getDuration();
                int currentPosition = 0;
                while (currentPosition<totalDuration)
                {
                    try {
                        sleep(500);
                        currentPosition = mediaPlayer.getCurrentPosition();
                        seekmusic.setProgress(currentPosition);
                    }

                    catch (InterruptedException | IllegalStateException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        };

        seekmusic.setMax(mediaPlayer.getDuration());
        updateseekbar.start();

        seekmusic.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

                mediaPlayer.seekTo(seekBar.getProgress());
            }
        });

        String endTime = createTime(mediaPlayer.getDuration());
        txtstop.setText(endTime);

        final Handler handler = new Handler();
        final int delay = 1000;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                String currentTime = createTime(mediaPlayer.getCurrentPosition());
                txtstart.setText(currentTime);
                handler.postDelayed(this,delay);
            }
        },delay);

        //        click Listener ON PLAY button

        btnplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying())
                {
                    btnplay.setBackgroundResource(R.drawable.play);
                    mediaPlayer.pause();
                }

                else
                {
                    btnplay.setBackgroundResource(R.drawable.pause);
                    mediaPlayer.start();
                }
            }
        });

        //        click Listener ON next button

        btnnext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
                mediaPlayer.release();

                if (shuffleBol amp;amp; !loopBol){
                    position=getRandom((mySongs.size()));
                }

                else if(!shuffleBol amp;amp; !loopBol)
                {
                    position=((position 1)%mySongs.size());
                }

                Uri u = Uri.parse(mySongs.get(position).toString());
                mediaPlayer = MediaPlayer.create(getApplicationContext(),u);
                sname=mySongs.get(position).getName();
                txtsname.setText(sname);
                mediaPlayer.start();
                btnplay.setBackgroundResource(R.drawable.pause);
                String endTime = createTime(mediaPlayer.getDuration());
                txtstop.setText(endTime);

            }
        });


        //        click Listener ON previous button

        btnprev.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();
                mediaPlayer.release();



                if (shuffleBol amp;amp; !loopBol){
                    position=getRandom((mySongs.size()));
                }

                else if(!shuffleBol amp;amp; !loopBol){
                        position=((position-1)<0)?(mySongs.size()-1):(position-1);
                }

                Uri u = Uri.parse(mySongs.get(position).toString());
                mediaPlayer = MediaPlayer.create(getApplicationContext(),u);
                sname=mySongs.get(position).getName();
                txtsname.setText(sname);
                mediaPlayer.start();
                btnplay.setBackgroundResource(R.drawable.pause);
                String endTime = createTime(mediaPlayer.getDuration());
                txtstop.setText(endTime);
            }
        });

        //        click listener for shuffle btn

        btnshuffle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (shuffleBol){
                    shuffleBol=false;
                    btnshuffle.setImageResource(R.drawable.shuffle_off);
                }

                else {
                    shuffleBol=true;
                    btnshuffle.setImageResource(R.drawable.shuffle_on);
                }

            }
        });

        //        click listener for loop btn

        btnloop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (loopBol){
                    loopBol=false;
                    btnloop.setImageResource(R.drawable.loop_off);
                }

                else {
                    loopBol=true;
                    btnloop.setImageResource(R.drawable.loop_on);
                }
            }
        });



//        next Listener ON song completion

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                btnnext.performClick();
            }
        });






    }


    public String createTime(int duration)
    {
        String time = "";
        int min = duration/1000/60;
        int sec = duration/1000`;

        time =min ":";

        if (sec<10)
        {
            time ="0";
        }
        time =sec;

        return time;
    }

    private int getRandom(int i) {
        Random random= new Random();
        return random.nextInt(i 1);
    }

}
 

PlayerActivity.xml

 <?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:background="@drawable/bg"
    android:orientation="vertical"
    android:weightSum="10"
    tools:context=".PlayerActivity"
    android:baselineAligned="false">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="7"
        android:gravity="center"
        android:orientation="vertical"
        tools:ignore="Suspicious0dp,UselessParent">

        <TextView
            android:id="@ id/txtsn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="0dp"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"

            android:singleLine="true"
            android:text="@string/song_name"
            android:textAlignment="center"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:textStyle="italic">

        </TextView>

        <ImageView
            android:id="@ id/imageview"
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:layout_marginBottom="8dp"
            android:src="@drawable/logo">

        </ImageView>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="60dp">

            <SeekBar
                android:id="@ id/seekbar"
                android:layout_width="250dp"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerInParent="true"
                android:layout_margin="20dp"
                android:layout_marginBottom="40dp">

            </SeekBar>

            <TextView
                android:id="@ id/txtstart"
                android:layout_width="78dp"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="false"
                android:layout_centerInParent="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="-17dp"
                android:layout_toLeftOf="@ id/seekbar"
                android:text="0:00"
                android:textAlignment="center"
                android:textColor="@color/black"
                android:textSize="15sp">

            </TextView>

            <TextView
                android:id="@ id/txtstop"
                android:layout_width="78dp"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="false"
                android:layout_centerInParent="true"
                android:layout_marginLeft="-14dp"
                android:layout_marginRight="20dp"
                android:layout_toRightOf="@ id/seekbar"
                android:text="@string/_4_10"
                android:textAlignment="center"
                android:textColor="@color/black"
                android:textSize="15sp">

            </TextView>

        </RelativeLayout>


    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="98dp"
        android:layout_weight="3">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@ id/playbtn"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:layout_centerHorizontal="true"
                android:background="@drawable/pause" />

            <ImageView
                android:id="@ id/btnnext"
                android:layout_width="55dp"
                android:layout_height="55dp"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="10dp"
                android:layout_toRightOf="@ id/playbtn"
                android:background="@drawable/next" />

            <ImageView
                android:id="@ id/btnprev"
                android:layout_width="55dp"
                android:layout_height="55dp"
                android:layout_marginTop="10dp"
                android:layout_marginRight="20dp"
                android:layout_toLeftOf="@ id/playbtn"
                android:background="@drawable/previous" />

            <ImageView
                android:id="@ id/btnshuffle"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_toLeftOf="@ id/btnprev"
                android:layout_marginTop="85dp"
                android:layout_marginRight="35dp"
                android:background="@drawable/shuffle_off"/>

            <ImageView
                android:id="@ id/btnloop"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_toRightOf="@ id/btnnext"
                android:layout_marginTop="85dp"
                android:layout_marginLeft="35dp"
                android:background="@drawable/loop_off"/>





        </RelativeLayout>

    </LinearLayout>

</LinearLayout>
 

Комментарии:

1. вам нужно обеспечить PlayerActivity ! Чтобы посмотреть, что на нем происходит.

2. Я только что это сделал. @Маджидхаджибаба

3. @Абхишексемвал. похоже, проблема в том, что вы отправляете позицию массива фильтров и отправляете список песен, который не отфильтрован. Вот почему это происходит. Поэтому вам нужно сделать так, чтобы либо отправить отфильтрованный массив. Или добавьте немного логики, чтобы получить правильное положение из списка песен. Это оно.

4. Пожалуйста, приведите соответствующую логику

Ответ №1:

введите описание изображения здесь

На рисунке выше вы видите, что отправляете позицию отфильтрованного массива и отправляете список песен (mysongs), который не отфильтрован. Вот почему это происходит.

Поэтому вам нужно сделать, это либо отправить отфильтрованный массив. Или добавьте немного логики, чтобы получить правильное положение из списка песен. Это оно.

если вы не можете понять, то дайте мне знать, что я обновлю соответствующую логику.

Комментарии:

1. На следующей странице мне нужно воспроизвести отфильтрованную песню.