Nano Hash - криптовалюты, майнинг, программирование

Когда я открыл искомый элемент, он открывает первый элемент ListView, а не искомый. Даже если поиск и найти предметы успешно

Когда я открыл искомый элемент, он открывает первый элемент 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);
    }
}

Чего не хватает?


  • Если у вас возникнут проблемы, лучше всего создать MCVE при публикации вопроса. Вы опубликовали почти 400 строк кода для решения этой проблемы. Людям приходится много анализировать и пытаться отлаживать онлайн. Пожалуйста, отредактируйте свой вопрос и изолируйте проблему, таким образом вы увеличите свои шансы на помощь. 02.02.2021

Ответы:


1

Я улучшил ваш адаптер, не тестировал его, но он должен работать... Я думаю, что проще переслать список песен, чем списки для каждого поля в отдельности... У вас есть исходный список для фильтрации и filteredList для представлений адаптера.. .

ОТРЕДАКТИРОВАНО: вам нужно реализовать Filterable, извините, я этого не видел...

public class ListAdapter extends BaseAdapter implements Filterable {

    private final Context context;
    private final List<Song> songlist;
    private final List<Song> filteredList;

    public ListAdapter(Context context, List<Song> songlist) {
        this.context = context;
        this.songlist = songlist;
        filteredList = new ArrayList<>();
        filteredList.addAll(songlist);
    }

    @Override
    public int getCount() {
        return filteredList.size();
    }

    @Override
    public Object getItem(int i) {
        return filteredList.get(i); // return Song item
    }

    @Override
    public long getItemId(int i) {
        return i;  //TODO change this to return song id
    }

    @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();

        Song song = filteredList.get(i);

        Picasso.get().load(song.getImageUrl()).transform(transformation).into(viewHolder.thumbnail);
        viewHolder.songName.setText(song.getSongName());
        viewHolder.artistName.setText(song.getSongArtist());
        viewHolder.songDuration.setText(song.getSongDuration());
        return view;
    }

    
@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering (CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (songlist != null && constraint != null) {
                filteredList.clear();
                List<Song> newValues = new ArrayList<>();
                for (Song song: songlist) {
                    if(constraint.length() == 0) {
                        newValues.add(song); //TODO change this if you want empty list
                    }else{
                        if(song.getSongName.toLowerCase().contains(constraint.toString().toLowerCase()))  {
                            newValues.add(song);
                        }
                    }
                }
                filteredList.addAll(newValues);
                //filteredList = newValues;
                results.count = newValues.size();
            }
            return results;
        }

        @Override
        protected void publishResults (CharSequence constraint, FilterResults results) {
            if (results != null && results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    };
}



    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);
        }
    }
}

а также

public void retrieveSongs() {
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Songs");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                List<Song> songsList = new ArrayList<>();
                for (DataSnapshot ds : snapshot.getChildren()) {
                    Song song = ds.getValue(Song.class);
                    songsList.add(song);
                    jcAudios.add(JcAudio.createFromURL(song.getSongName(), song.getSongUrl()));
                }
                adapter = new ListAdapter(getApplicationContext(), songsList);
                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();
            }
        }); 
    }

Также лучше создать один экземпляр адаптера и swapData в retrieveSongs...

EDITED: Попробуйте что-то вроде этого

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Song song = (Song)adapter.getItem(i)
            jcPlayerView.playAudio(JcAudio.createFromURL(song.getSongName(), song.getSongUrl()));
            jcPlayerView.setVisibility(View.VISIBLE);
            jcPlayerView.createNotification();
            adapter.notifyDataSetChanged();
        }
    });
02.02.2021
  • Ничего не изменилось, сэр, я попробовал этот шаг, но не работает, он дает неверный результат после нажатия на искомый элемент. 02.02.2021
  • Мой ответ связан с тем, чтобы фильтр не щелкалListener... для прослушивателя кликов вы должны установить URL-адрес объекта песни... когда вы нажимаете на элемент, вы получаете песню getItem из списка и берете URL-адрес из объекта песни... (без списка jcAudios ) 02.02.2021
  • Это мой любимый вопрос (onClickListener), что делать? , я старался как мог, но я не силен в этом, помогите мне плиз 02.02.2021
  • В OnItemClickListener у вас есть объект Song, и нет необходимости в jcAudios lis, вы можете создать URL-адрес, например JcAudio.createFromURL(song.getSongName(), song.getSongUrl()). Проверить отредактировано 2 02.02.2021
  • Это было мое предпочтительное решение, очень чистое и эффективное. Вау, я впечатлен. Это было решение, которое я ищу! Большое спасибо. Также помогает улучшить мое понимание создание одного экземпляра адаптера и swapData в retrieveSongs. Хорошего дня 02.02.2021
  • Я предполагаю, что вы удалили все эти списки и используете только список песен, как я вам предложил... 02.02.2021
  • да, я сделал, сработало, сэр, большое спасибо 02.02.2021
  • Также вам нужно настроить jcPlayerView.initPlaylist(jcAudios, null) для этого 02.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..