多个副本从 SD 卡加载到 GridView
Multiple duplicates load into GridView from SD card
我正在尝试将 Uri
声音文件从我的 SD 卡加载到自定义 GridView
中,其中每个项目都包含一个 ImageView
(对于 Uri
)和一个TextView
用于声音文件标题,但它不断加载重复项。我的卡上有 6 个声音文件,但它加载了 12 个,然后非常奇怪地加载了所有可绘制对象之后又加载了 3 个。可绘制对象(占位符图像)加载正常,它们加载了正确的数字。
我将很多文件 I/O 放入 AsyncTask
,但我怀疑这会导致类似这样的问题。
当我记录所有内容时,我看到一些东西被意外加载了几次(下面的控制台),包括奇怪的空值。除了加载图像而不是声音文件外,我还有其他具有完全相同过程的工作代码,而且它工作得很好,所以这真的很令人费解。我意识到将 Uri
s 加载到 GridView
中并不理想,因为在 ImageView
中没有什么可看的,但是当我单击每个项目时,它会播放文件,因此部分是正确的。稍后我会修改图像问题。
知道为什么东西会如此奇怪地重复加载吗?谢谢。
更新
事实证明,因为我的适配器构造函数中有 ArrayList<AudioGridItem>
,所以对我的列表的任何更改都会自动更新,所以我不需要再次手动将其添加到适配器中。所以我刚刚删除了我 onPostExecute()
中的添加到适配器并且它起作用了!
@Override
protected void onPostExecute(AudioGridItem result) {
progressDialog.dismiss();
// add the default icons remaining, to GridView, if less than 15 files on SD card
for (int i = 0; i < (15 - numberSDCardFiles.length); i++) {
audioAdapter.add(drawable);
}
audioAdapter.notifyDataSetChanged();
}
AudioTab.java
package org.azurespot.cutecollection.audiotab;
import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import org.azurespot.R;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by mizu on 2/8/15.
*/
public class AudioTab extends Fragment {
private GridView gridView;
private GridViewAudioAdapter audioAdapter;
private ProgressDialog progressDialog;
private String[] numberSDCardFiles = null;
File[] files;
ArrayList<AudioGridItem> audioFiles = new ArrayList<>();
MediaPlayer mp;
AudioGridItem audioGridItem;
AudioGridItem drawable;
public AudioTab(){
super();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.audio_tab, container, false);
mp = new MediaPlayer();
// instantiate your progress dialog
progressDialog = new ProgressDialog(getActivity());
// with fragments, make sure you include the rootView when finding id
gridView = (GridView) v.findViewById(R.id.audio_grid);
// Create the Custom Adapter Object
audioAdapter = new GridViewAudioAdapter(getActivity(), audioFiles);
// Set the Adapter to GridView
gridView.setAdapter(audioAdapter);
Log.d("TAG", "Items in audioAdapter1: " + audioAdapter.getCount());
if(audioAdapter.getCount() == 0) {
// load contents of SD card through AsyncTask
new AudioDownloaderTask().execute();
}
setupGridViewListener();
return v;
}
private class AudioDownloaderTask extends AsyncTask<Object, Void, AudioGridItem> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setMessage("Loading cute collection ...");
//set the progress bar to cancelable on back button
progressDialog.setCancelable(true);
progressDialog.show();
}
@Override
protected AudioGridItem doInBackground(Object... params) {
retrieveAudio();
return null;
}
@Override
protected void onPostExecute(AudioGridItem result) {
progressDialog.dismiss();
Log.d("TAG", "Items in audioFiles: " + audioFiles.size());
// Add whole ArrayList to adapter
audioAdapter.addAll(audioFiles);
Log.d("TAG", "Number of item in audioAdapter2: " + audioAdapter.getCount());
// add the default icons remaining, to GridView, if less than 15 files on SD card
for (int i = 0; i < (15 - numberSDCardFiles.length); i++) {
audioAdapter.add(drawable);
}
audioAdapter.notifyDataSetChanged();
Log.d("TAG", "Number of item in audioAdapter3: " + audioAdapter.getCount());
Log.d("TAG", "Number of items in SD Card files: " +numberSDCardFiles.length);
}
}
public void retrieveAudio() {
try {
// gets directory Cute Videos from sd card
File cuteVideosDir = new File(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PODCASTS), "Cute Sounds");
// puts list into files Array
files = cuteVideosDir.listFiles();
// get number of files in Cute Sounds directory
numberSDCardFiles = new String[files.length];
for (File singleFile : files) {
// get both audio file and audio title
Uri audioUri = Uri.fromFile(singleFile);
String audioTitle = singleFile.getName();
audioGridItem = new AudioGridItem(audioUri, audioTitle);
// add Uri and title to ArrayList
audioFiles.add(audioGridItem);
}
// changes drawable into an AudioGridItem object (Uri, but no String)
drawable = new AudioGridItem(Uri.parse("android.resource://org.azurespot/"
+ R.drawable.ic_sounds_placeholder), null);
} catch (Exception e) {
e.printStackTrace();
}
}
private void setupGridViewListener() {
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView,
View item, int pos, long id) {
if(!(audioAdapter.getItem(pos).equals(drawable))) {
Uri soundFile = (audioAdapter.getItem(pos)).getAudio();
try {
mp.setDataSource(getActivity(), soundFile);
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
}
GridViewAudioAdapter.java
package org.azurespot.cutecollection.audiotab;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.apache.commons.io.FilenameUtils;
import org.azurespot.R;
import java.util.ArrayList;
/**
* Created by mizu on 2/8/15.
*/
public class GridViewAudioAdapter extends ArrayAdapter<AudioGridItem> {
private TextView audioTitleView;
int position;
ViewHolder holder = null;
public GridViewAudioAdapter(Context context, ArrayList<AudioGridItem> audio) {
super(context, 0, audio);
}
@Override
public View getView(int position, View itemView, ViewGroup parent) {
this.position = position;
if (itemView == null) {
itemView = LayoutInflater.from(getContext())
.inflate(R.layout.audio_tab_item, parent, false);
holder = new ViewHolder();
holder.audioView = (ImageView) itemView.findViewById(R.id.audio_icon);
audioTitleView = (TextView) itemView.findViewById(R.id.audio_title);
// stores holder with view
itemView.setTag(holder);
} else {
holder = (ViewHolder)itemView.getTag();
}
// get position of the item clicked in GridView
final AudioGridItem audioGridItem = getItem(position);
if (audioGridItem != null) {
Uri audioUri = audioGridItem.getAudio();
String audioTitle = audioGridItem.getAudioTitle();
String rootName = FilenameUtils.removeExtension(audioTitle);
Log.d("TAG", "Value of audioTitle: " + audioTitle);
Log.d("TAG", "Value of rootName: " + rootName);
// set the photos into the ImageView slots
holder.audioView.setImageURI(audioUri);
audioTitleView.setText(rootName);
// positioning the image in the GridView slot
holder.audioView.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.audioView.setLayoutParams(new LinearLayout.LayoutParams
(250, 250));
}
return itemView;
}
public class ViewHolder{
ImageView audioView;
}
}
这是我的模型:AudioGridItem.java
package org.azurespot.cutecollection.audiotab;
import android.net.Uri;
/**
* Created by mizu on 4/26/15.
*/
public class AudioGridItem {
private Uri audio;
private String audioTitle;
public AudioGridItem(Uri audio, String autoTitle) {
super();
this.audio = audio;
this.audioTitle = autoTitle;
}
public Uri getAudio() {
return audio;
}
public void setAudio(Uri audio){
this.audio = audio;
}
public String getAudioTitle(){
return audioTitle;
}
public void setAudioTitle(String audioTitle){
this.audioTitle = audioTitle;
}
}
日志
04-27 16:46:56.406 24668-24668/org.azurespot D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-27 17:04:28.176 24668-24668/org.azurespot D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-27 17:04:28.326 24668-24668/org.azurespot D/TAG﹕ Items in audioAdapter1: 0
04-27 17:04:28.376 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.376 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.386 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.386 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:28.476 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:28.476 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
04-27 17:04:28.476 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound47.3gpp
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound47
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound49.3gpp
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound49
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound51.3gpp
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound51
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Items in audioFiles: 6
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Number of item in audioAdapter2: 12
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Number of item in audioAdapter3: 21
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Number of items in SD Card files: 6
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound47.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound47
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound49.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound49
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound51.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound51
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound47.3gpp
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound47
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound49.3gpp
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound49
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound51.3gpp
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound51
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:29.876 24668-24668/org.azurespot D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
看看这个
audioAdapter = new GridViewAudioAdapter(getActivity(), audioFiles);
上面的行 audioFiles
是空的 ArrayList
并且你的 audioAdapter
正在寻找它作为他的后盾。现在在你的 retrieveAudio()
方法中你添加项目audioFiles
像这样 audioFiles.add(audioGridItem);
现在 audioFiles
包含 1 个项目,-(假设这是您添加的唯一项目)但是在您的 onPostExecute
中您调用这样做
Log.d("TAG", "Items in audioFiles: " + audioFiles.size());
// Add whole ArrayList to adapter
audioAdapter.addAll(audioFiles); //pay attention here
Log.d("TAG", "Number of item in audioAdapter2: " + audioAdapter.getCount());
您现在已将 audioFiles
添加到 audioFiles
,从而使您的 GridView
中共有两项来自文档 addAll(collection) 添加指定的数组末尾的集合 这意味着它不会替换它,所以你要做的就是忘记 onPostExecute
添加并使用 onProgressUpdate
通过一个并调用 notifyDatasetChanged()
因为你不能在 doInBackground
中调用它
我正在尝试将 Uri
声音文件从我的 SD 卡加载到自定义 GridView
中,其中每个项目都包含一个 ImageView
(对于 Uri
)和一个TextView
用于声音文件标题,但它不断加载重复项。我的卡上有 6 个声音文件,但它加载了 12 个,然后非常奇怪地加载了所有可绘制对象之后又加载了 3 个。可绘制对象(占位符图像)加载正常,它们加载了正确的数字。
我将很多文件 I/O 放入 AsyncTask
,但我怀疑这会导致类似这样的问题。
当我记录所有内容时,我看到一些东西被意外加载了几次(下面的控制台),包括奇怪的空值。除了加载图像而不是声音文件外,我还有其他具有完全相同过程的工作代码,而且它工作得很好,所以这真的很令人费解。我意识到将 Uri
s 加载到 GridView
中并不理想,因为在 ImageView
中没有什么可看的,但是当我单击每个项目时,它会播放文件,因此部分是正确的。稍后我会修改图像问题。
知道为什么东西会如此奇怪地重复加载吗?谢谢。
更新
事实证明,因为我的适配器构造函数中有 ArrayList<AudioGridItem>
,所以对我的列表的任何更改都会自动更新,所以我不需要再次手动将其添加到适配器中。所以我刚刚删除了我 onPostExecute()
中的添加到适配器并且它起作用了!
@Override
protected void onPostExecute(AudioGridItem result) {
progressDialog.dismiss();
// add the default icons remaining, to GridView, if less than 15 files on SD card
for (int i = 0; i < (15 - numberSDCardFiles.length); i++) {
audioAdapter.add(drawable);
}
audioAdapter.notifyDataSetChanged();
}
AudioTab.java
package org.azurespot.cutecollection.audiotab;
import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import org.azurespot.R;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by mizu on 2/8/15.
*/
public class AudioTab extends Fragment {
private GridView gridView;
private GridViewAudioAdapter audioAdapter;
private ProgressDialog progressDialog;
private String[] numberSDCardFiles = null;
File[] files;
ArrayList<AudioGridItem> audioFiles = new ArrayList<>();
MediaPlayer mp;
AudioGridItem audioGridItem;
AudioGridItem drawable;
public AudioTab(){
super();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.audio_tab, container, false);
mp = new MediaPlayer();
// instantiate your progress dialog
progressDialog = new ProgressDialog(getActivity());
// with fragments, make sure you include the rootView when finding id
gridView = (GridView) v.findViewById(R.id.audio_grid);
// Create the Custom Adapter Object
audioAdapter = new GridViewAudioAdapter(getActivity(), audioFiles);
// Set the Adapter to GridView
gridView.setAdapter(audioAdapter);
Log.d("TAG", "Items in audioAdapter1: " + audioAdapter.getCount());
if(audioAdapter.getCount() == 0) {
// load contents of SD card through AsyncTask
new AudioDownloaderTask().execute();
}
setupGridViewListener();
return v;
}
private class AudioDownloaderTask extends AsyncTask<Object, Void, AudioGridItem> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setMessage("Loading cute collection ...");
//set the progress bar to cancelable on back button
progressDialog.setCancelable(true);
progressDialog.show();
}
@Override
protected AudioGridItem doInBackground(Object... params) {
retrieveAudio();
return null;
}
@Override
protected void onPostExecute(AudioGridItem result) {
progressDialog.dismiss();
Log.d("TAG", "Items in audioFiles: " + audioFiles.size());
// Add whole ArrayList to adapter
audioAdapter.addAll(audioFiles);
Log.d("TAG", "Number of item in audioAdapter2: " + audioAdapter.getCount());
// add the default icons remaining, to GridView, if less than 15 files on SD card
for (int i = 0; i < (15 - numberSDCardFiles.length); i++) {
audioAdapter.add(drawable);
}
audioAdapter.notifyDataSetChanged();
Log.d("TAG", "Number of item in audioAdapter3: " + audioAdapter.getCount());
Log.d("TAG", "Number of items in SD Card files: " +numberSDCardFiles.length);
}
}
public void retrieveAudio() {
try {
// gets directory Cute Videos from sd card
File cuteVideosDir = new File(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PODCASTS), "Cute Sounds");
// puts list into files Array
files = cuteVideosDir.listFiles();
// get number of files in Cute Sounds directory
numberSDCardFiles = new String[files.length];
for (File singleFile : files) {
// get both audio file and audio title
Uri audioUri = Uri.fromFile(singleFile);
String audioTitle = singleFile.getName();
audioGridItem = new AudioGridItem(audioUri, audioTitle);
// add Uri and title to ArrayList
audioFiles.add(audioGridItem);
}
// changes drawable into an AudioGridItem object (Uri, but no String)
drawable = new AudioGridItem(Uri.parse("android.resource://org.azurespot/"
+ R.drawable.ic_sounds_placeholder), null);
} catch (Exception e) {
e.printStackTrace();
}
}
private void setupGridViewListener() {
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView,
View item, int pos, long id) {
if(!(audioAdapter.getItem(pos).equals(drawable))) {
Uri soundFile = (audioAdapter.getItem(pos)).getAudio();
try {
mp.setDataSource(getActivity(), soundFile);
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
}
GridViewAudioAdapter.java
package org.azurespot.cutecollection.audiotab;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.apache.commons.io.FilenameUtils;
import org.azurespot.R;
import java.util.ArrayList;
/**
* Created by mizu on 2/8/15.
*/
public class GridViewAudioAdapter extends ArrayAdapter<AudioGridItem> {
private TextView audioTitleView;
int position;
ViewHolder holder = null;
public GridViewAudioAdapter(Context context, ArrayList<AudioGridItem> audio) {
super(context, 0, audio);
}
@Override
public View getView(int position, View itemView, ViewGroup parent) {
this.position = position;
if (itemView == null) {
itemView = LayoutInflater.from(getContext())
.inflate(R.layout.audio_tab_item, parent, false);
holder = new ViewHolder();
holder.audioView = (ImageView) itemView.findViewById(R.id.audio_icon);
audioTitleView = (TextView) itemView.findViewById(R.id.audio_title);
// stores holder with view
itemView.setTag(holder);
} else {
holder = (ViewHolder)itemView.getTag();
}
// get position of the item clicked in GridView
final AudioGridItem audioGridItem = getItem(position);
if (audioGridItem != null) {
Uri audioUri = audioGridItem.getAudio();
String audioTitle = audioGridItem.getAudioTitle();
String rootName = FilenameUtils.removeExtension(audioTitle);
Log.d("TAG", "Value of audioTitle: " + audioTitle);
Log.d("TAG", "Value of rootName: " + rootName);
// set the photos into the ImageView slots
holder.audioView.setImageURI(audioUri);
audioTitleView.setText(rootName);
// positioning the image in the GridView slot
holder.audioView.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.audioView.setLayoutParams(new LinearLayout.LayoutParams
(250, 250));
}
return itemView;
}
public class ViewHolder{
ImageView audioView;
}
}
这是我的模型:AudioGridItem.java
package org.azurespot.cutecollection.audiotab;
import android.net.Uri;
/**
* Created by mizu on 4/26/15.
*/
public class AudioGridItem {
private Uri audio;
private String audioTitle;
public AudioGridItem(Uri audio, String autoTitle) {
super();
this.audio = audio;
this.audioTitle = autoTitle;
}
public Uri getAudio() {
return audio;
}
public void setAudio(Uri audio){
this.audio = audio;
}
public String getAudioTitle(){
return audioTitle;
}
public void setAudioTitle(String audioTitle){
this.audioTitle = audioTitle;
}
}
日志
04-27 16:46:56.406 24668-24668/org.azurespot D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-27 17:04:28.176 24668-24668/org.azurespot D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-27 17:04:28.326 24668-24668/org.azurespot D/TAG﹕ Items in audioAdapter1: 0
04-27 17:04:28.376 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.376 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.386 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.386 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.446 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:28.466 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:28.476 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:28.476 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
04-27 17:04:28.476 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound47.3gpp
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound47
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound49.3gpp
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound49
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound51.3gpp
04-27 17:04:28.486 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound51
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Items in audioFiles: 6
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Number of item in audioAdapter2: 12
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Number of item in audioAdapter3: 21
04-27 17:04:28.606 24668-24668/org.azurespot D/TAG﹕ Number of items in SD Card files: 6
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.616 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
04-27 17:04:28.626 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound47.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound47
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound49.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound49
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound51.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound51
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:28.636 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound47.3gpp
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound47
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound49.3gpp
04-27 17:04:28.646 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound49
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound51.3gpp
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound51
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:28.656 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:28.666 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:29.876 24668-24668/org.azurespot D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: null
04-27 17:04:30.516 24668-24668/org.azurespot D/TAG﹕ Value of rootName: null
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound54.3gpp
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound54
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound66.3gpp
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound66
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of audioTitle: Sound19.3gpp
04-27 17:04:31.696 24668-24668/org.azurespot D/TAG﹕ Value of rootName: Sound19
看看这个
audioAdapter = new GridViewAudioAdapter(getActivity(), audioFiles);
上面的行 audioFiles
是空的 ArrayList
并且你的 audioAdapter
正在寻找它作为他的后盾。现在在你的 retrieveAudio()
方法中你添加项目audioFiles
像这样 audioFiles.add(audioGridItem);
现在 audioFiles
包含 1 个项目,-(假设这是您添加的唯一项目)但是在您的 onPostExecute
中您调用这样做
Log.d("TAG", "Items in audioFiles: " + audioFiles.size());
// Add whole ArrayList to adapter
audioAdapter.addAll(audioFiles); //pay attention here
Log.d("TAG", "Number of item in audioAdapter2: " + audioAdapter.getCount());
您现在已将 audioFiles
添加到 audioFiles
,从而使您的 GridView
中共有两项来自文档 addAll(collection) 添加指定的数组末尾的集合 这意味着它不会替换它,所以你要做的就是忘记 onPostExecute
添加并使用 onProgressUpdate
通过一个并调用 notifyDatasetChanged()
因为你不能在 doInBackground