当我打开搜索到的项目时,它打开的是 ListView 的第一个项目,而不是搜索到的项目即使搜索和找到项目成功

如何解决当我打开搜索到的项目时,它打开的是 ListView 的第一个项目,而不是搜索到的项目即使搜索和找到项目成功

当我打开搜索到的项目时,它打开的是 ListView 的第一个项目,而不是搜索到的项目。即使搜索和找到项目成功。

我使用“implements Filterable”配置适配器并使用“.setTextFilterEnabled(true)”启用Listview,但不起作用。

我看到我必须实现“public Filter getFilter()”,但我不知道该怎么做。

当我在 EditText 中输入一些单词时,例如“cel”或“12”,过滤器会起作用,但结果总是相同的:Listview 中的前两项,无论 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,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);
    }
}

缺少什么?

解决方法

我改进了你的适配器,没有对其进行测试,但它应该可以工作......我认为转发歌曲列表比单独每个字段的列表更容易......你有用于过滤的原始列表和用于适配器的filteredList意见...

编辑:你必须实现可过滤,抱歉我没有看到这个......

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

也最好在retrieveSongs中创建一个adapter和swapData实例...

编辑:尝试这样的事情

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView,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();
        }
    });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-