Когда я открыл искомый элемент, он открывает первый элемент ListView, а не искомый. Даже если поиск и найти элементы успешно.
Я настраиваю адаптер с помощью Filterable и включаю Listview с помощью .setTextFilterEnabled(true), но это не работает.
Я видел, что должен реализовать публичный фильтр getFilter(), но понятия не имею, как это сделать.
Когда я набираю некоторые слова в EditText, например cel или 12, фильтр срабатывает, но результат всегда один и тот же: первые два элемента в Listview, независимо от того, что находится в Listview (содержимое списка случайно).
Ниже фрагмент моей деятельности:
public class MusicActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
private boolean checkPermission = false;
ProgressDialog progressDialog;
ListView listView;
List<String> songsNameList;
List<String> songsUrlList;
List<String> songsArtistList;
List<String> songsDurationList;
ListAdapter adapter;
JcPlayerView jcPlayerView;
List<JcAudio> jcAudios;
List<String> thumbnail;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
progressDialog = new ProgressDialog(this);
progressDialog.show();
progressDialog.setMessage("Please Wait...");
listView = findViewById(R.id.songsList);
songsNameList = new ArrayList<>();
songsUrlList = new ArrayList<>();
songsArtistList = new ArrayList<>();
songsDurationList = new ArrayList<>();
jcAudios = new ArrayList<>();
thumbnail = new ArrayList<>();
jcPlayerView = findViewById(R.id.jcplayer);
retrieveSongs();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
jcPlayerView.playAudio(jcAudios.get(i));
jcPlayerView.setVisibility(View.VISIBLE);
jcPlayerView.createNotification();
adapter.notifyDataSetChanged();
}
});
}
// RETRIEVING THE SONGS FROM THE SERVER
public void retrieveSongs() {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Songs");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
Song song = ds.getValue(Song.class);
songsNameList.add(song.getSongName());
songsUrlList.add(song.getSongUrl());
songsArtistList.add(song.getSongArtist());
songsDurationList.add(song.getSongDuration());
thumbnail.add(song.getImageUrl());
jcAudios.add(JcAudio.createFromURL(song.getSongName(), song.getSongUrl()));
}
adapter = new ListAdapter(getApplicationContext(), songsNameList, thumbnail, songsArtistList, songsDurationList);
jcPlayerView.initPlaylist(jcAudios, null);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
progressDialog.dismiss();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(MusicActivity.this, "FAILED!", Toast.LENGTH_SHORT).show();
}
});
}
/*@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.app_menu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.searchmenu:
startActivity(new Intent(MusicActivity.this,Search.class));
break;
case R.id.requestmenu:
startActivity(new Intent(MusicActivity.this,UploadSongActivity.class));
break;
case R.id.sharemenu:
break;
}
return true;
}*/
// Filter Class
// METHOD TO HANDEL RUNTIME PERMISSIONS
private boolean validatePermissions(){
Dexter.withContext(getApplicationContext())
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
checkPermission = true;
}
@Override
public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {
checkPermission = false;
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
permissionToken.continuePermissionRequest();
}
}).check();
return checkPermission;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if(TextUtils.isEmpty(newText)){
adapter.filter("");
listView.clearTextFilter();
}else{
String texto = newText;
adapter.filter(newText);
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.searchmenu, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint("Search Catholic songs");
searchView.setOnQueryTextListener(this);
searchView.setIconified(false);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.search) {
return true;
}
else if(id == R.id.Rate){
/*if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
//log.d("TAG", "The intersitial wasn't loaded yet.");
}*/
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + getString(R.string.packegname)));
startActivity(intent);
}
else if (id ==R.id.sharemenu){
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,
"Hey ! check out this music service that gives you access to Hundreds of catholic songs. through Catholic app at: https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID);
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
else if(id == R.id.uploadItem){
if (validatePermissions()){
Intent intent = new Intent(this,UploadSongActivity.class);
startActivity(intent);
}
}
return super.onOptionsItemSelected(item);
}
и ниже моего CustomAdapter:
public class ListAdapter extends BaseAdapter {
List<String> songNames;
List<String> thumbnails;
List<String> songArtist;
List<String> songDuration;
Context context;
private List<String> copyList;
private int searchedItem = -1;
private ArrayList<Song> arraylist;
public ListAdapter(Context context, List<String> songNames, List<String> thumbnails, List<String> songArtist, List<String> songDuration) {
this.context = context;
this.songNames = songNames;
this.thumbnails = thumbnails;
this.songArtist = songArtist;
this.songDuration = songDuration;
copyList = new ArrayList<String>();
copyList.addAll(songNames);
}
@Override
public int getCount() {
return songNames.size();
}
@Override
public Object getItem(int i) {
return songNames.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@SuppressLint({"InflateParams", "ViewHolder"})
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder viewHolder;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.songs_list_layout, null);
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) view.getTag();
}
Transformation transformation = new RoundedTransformationBuilder()
.cornerRadiusDp(15)
.build();
Picasso.get().load(thumbnails.get(i)).transform(transformation).into(viewHolder.thumbnail);
viewHolder.songName.setText(songNames.get(i));
viewHolder.artistName.setText(songArtist.get(i));
viewHolder.songDuration.setText(songDuration.get(i));
return view;
}
public void filter(String queryText)
{
songNames.clear();
if(queryText.isEmpty())
{
songNames.addAll(copyList);
}
else
{
for(String name: copyList)
{
if(name.toLowerCase().contains(queryText.toLowerCase()))
{
songNames.add(name);
}
}
}
notifyDataSetChanged();
}
private static class ViewHolder{
TextView songName;
TextView artistName;
TextView songDuration;
ImageView thumbnail;
CardView cardView;
ImageView currentlyPlaying;
ViewHolder(View view){
songName = view.findViewById(R.id.songName);
thumbnail = view.findViewById(R.id.songThumbnail);
artistName = view.findViewById(R.id.artistName);
songDuration = view.findViewById(R.id.songDuration);
cardView = view.findViewById(R.id.cardView);
currentlyPlaying = view.findViewById(R.id.currentlyPlaying);
}
}
Чего не хватает?