下面这段代码为什么在我点击更新媒体库(就是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;
}
}
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));
}
要么arrayAdapter.addAll(nameList)在notifyDataSetChanged()之前,要么每次更新时调用 listview.setAdapter(arrayAdapter);