安卓新人求大神们的帮助,先谢过大家

下面这段代码为什么在我点击更新媒体库(就是menu里面的选项)没有反应呢?按理说不是应该用歌名把nameList填充满吗?
我是用真机测试的,本来是有歌曲的。
诚心求解。

 package com.example.tonyn.nkpdqzmusic;

import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Main2Activity extends AppCompatActivity {
    private MediaPlayer mediaPlayer;
    private List<String> uriList = new ArrayList<>();
    private List<String> nameList = new ArrayList<>();
    Cursor cursor;
    ArrayAdapter<String> arrayAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        arrayAdapter = new ArrayAdapter<String>(Main2Activity.this,android.R.layout.simple_list_item_1,nameList);
        ListView listview = (ListView) findViewById(R.id.list_view);
        listview.setAdapter(arrayAdapter);
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(MyService.ACTION_PLAY);
                intent.putExtra("content_uri",uriList.get(position));
                startService(intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main2,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
            case R.id.update_list:
                try {
                    ContentResolver contentResolver = getContentResolver();
                    cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
                    if (cursor != null) {
                        while (cursor.moveToNext()) {
                            String uri = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                            String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                            uriList.add(uri);
                            nameList.add(name);
                        }
                        arrayAdapter.notifyDataSetChanged();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
                finally{
                if(cursor!=null)
                    cursor.close();
            }
                break;
            default:
        }
        return true;
    }
}

2个回答

arrayadapte绑定的list不是nameList,你初始化传进去的nameList只是让arrayadapter构建了一个新的list,并将namelist的数据放到新的构建出来的list里面。所以,你在后面改变nameList的内容,实际上并没有改变arrayadapter绑定的list。你可以在arrayAdapter.notifyDataSetChanged()之前调用arrayAdapter.addAll(nameList)去更新arrayadapter绑定的list。
请看arrayadapter的源码:

    public ArrayAdapter(Context context, @LayoutRes int resource, @NonNull T[] objects) {
        this(context, resource, 0, Arrays.asList(objects));
    }

stone_you
stone_you 回复NKPDQZ: 那你换INTERNAL_CONTENT_URI这个uri试试看呢,我在我的手机上试了可以查出来的
大约 3 年之前 回复
NKPDQZ
NKPDQZ 回复stone_you: 不是放在sd卡里的也行吗?我的本地里是有歌曲的啊。。点击完毕之后刷新好久都没刷出来,不过还是谢谢你不辞辛苦帮助我
大约 3 年之前 回复
stone_you
stone_you 回复NKPDQZ: INTERNAL_CONTENT_URI这个uri可以查系统内置的铃音,你用这个试试,应该会查出来,你前面查不出来应该是手机里没有放歌曲吧
大约 3 年之前 回复
stone_you
stone_you 回复NKPDQZ: 能查到自己放的歌曲,但是系统铃音查不到
大约 3 年之前 回复
stone_you
stone_you 回复NKPDQZ: 你这个代码是可以查出来手机里的音乐的,亲测没有问题,你确定你手机里面有歌曲吗?
大约 3 年之前 回复
stone_you
stone_you 回复NKPDQZ: 手动的能加载出来,说明adapter的刷新已经改好了,现在来看看provider数据查不来的问题,我帮你看看啊
大约 3 年之前 回复
NKPDQZ
NKPDQZ 回复stone_you: 手动加入数据是可以刷新出来的,感觉更晕了。。。。
大约 3 年之前 回复
stone_you
stone_you 回复NKPDQZ: 那你这个是provider都没有查出来数据啊,所以肯定不现实了。你先看看你手动往nameList里面添加点数据,看能不能更新出来,先解决adapter刷新的问题,然后再来看看provider没有数据的问题
大约 3 年之前 回复
NKPDQZ
NKPDQZ 回复stone_you: 没有出来
大约 3 年之前 回复
stone_you
stone_you 回复NKPDQZ: 打log看看name的值有没有查出来
大约 3 年之前 回复
stone_you
stone_you 打log看看name的值有没有查出来
大约 3 年之前 回复
stone_you
stone_you 打log看看name的值有没有查出来
大约 3 年之前 回复
NKPDQZ
NKPDQZ 回复NKPDQZ: 但是好像用这个办法还是刷新不出来列表,依然没反应。。。
大约 3 年之前 回复
NKPDQZ
NKPDQZ 谢谢,理解了一些
大约 3 年之前 回复

要么arrayAdapter.addAll(nameList)在notifyDataSetChanged()之前,要么每次更新时调用 listview.setAdapter(arrayAdapter);

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问