Android 自定义listview项仅在滚动之前加载默认值
我使用了一个定制的listview,但是大多数项目在开始时都会显示它们的默认值,直到我向下滚动,同时滚动项目的一部分数据,另一部分显示默认值 例如: 适配器代码:Android 自定义listview项仅在滚动之前加载默认值,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我使用了一个定制的listview,但是大多数项目在开始时都会显示它们的默认值,直到我向下滚动,同时滚动项目的一部分数据,另一部分显示默认值 例如: 适配器代码: private class MyAdapter extends ArrayAdapter<Song> { public MyAdapter(Activity activity){ super(activity, R.layout.song_view, songs);
private class MyAdapter extends ArrayAdapter<Song> {
public MyAdapter(Activity activity){
super(activity, R.layout.song_view, songs);
}
@Override
public Song getItem(int position) {
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if(itemView == null) {
itemView = getActivity().getLayoutInflater().inflate(R.layout.song_view, parent, false);
}
Song currentSong = songs.get(position);
Toast.makeText(getContext(), currentSong.getName() +" " + position, Toast.LENGTH_SHORT).show();
ImageView imageView = (ImageView)view.findViewById(R.id.defalut_song_image);
try{
Bitmap songImage = BitmapFactory.decodeByteArray(currentSong.getImage(), 0, currentSong.getImage().length);
imageView.setImageBitmap(songImage);
}catch (Exception d){
}
try {
TextView songName = (TextView) view.findViewById(R.id.song_name);
songName.setText(currentSong.getName());
}catch (Exception e){
}
try {
TextView duration = (TextView)view.findViewById(R.id.duration);
long durationString = currentSong.getDuration();
long min = durationString / 60000;
long sec = (durationString % 60000) / 1000;
duration.setText(min + ":" + sec);
}catch (Exception e){
}
try {
TextView artist = (TextView)view.findViewById(R.id.artist);
artist.setText(currentSong.getArtist());
}catch (Exception e){
}
return itemView;
}
@Override
public int getCount() {
return songs == null ? 0 : songs.size();
}
}
你能显示你设置适配器的类吗?你需要在你的适配器类中实现
ViewHolder
。我实现了ViewHolder,但是现在大多数项目即使在滚动之后也不会加载!你试过使用notifyDataChanged()吗?我试过了,没有区别
package andy.propaganda;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.Serializable;
import java.util.ArrayList;
/**
* A simple {@link Fragment} subclass.
*/
public class MyLibrary extends Fragment implements Serializable {
private ListView listView;
private ArrayList<Song> songs;
private ArrayAdapter<Song> myAdapter;
private View view;
private MusicService musicService;
boolean isPlaying = false;
public MyLibrary() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_my_library, container, false);
songs = (ArrayList<Song>) getArguments().get("array");
musicService = (MusicService) getArguments().get("service");
listen();
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
songs = (ArrayList<Song>)getArguments().getSerializable("array");
//
listView = (ListView)view.findViewById(R.id.song_list_view);
myAdapter = new MyAdapter(getActivity());
// Toast.makeText(getContext(), myAdapter.getCount() + "", Toast.LENGTH_LONG).show();
listView.setAdapter(myAdapter);
listen();
}
private void listen() {
ListView listView = (ListView)view.findViewById(R.id.song_list_view);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Song currSong = songs.get(position);
// Toast.makeText(getContext(), currSong.getBitRate(), Toast.LENGTH_LONG).show();
Uri trackUri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, currSong.getDataSourse());
if(isPlaying){
musicService.stopCurrent();
}
isPlaying = true;
musicService.play(currSong.getBitRate());///
Toast.makeText(getContext(), currSong.getName(), Toast.LENGTH_SHORT).show();
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
return false;
}
});
}
private class MyAdapter extends ArrayAdapter<Song> {
public MyAdapter(Activity activity){
super(activity, R.layout.song_view, songs);
}
@Override
public Song getItem(int position) {
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if(itemView == null) {
itemView = getActivity().getLayoutInflater().inflate(R.layout.song_view, parent, false);
}
Song currentSong = songs.get(position);
ImageView imageView = (ImageView)view.findViewById(R.id.defalut_song_image);
try{
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(currentSong.getBitRate());
byte[] arr = mediaMetadataRetriever.getEmbeddedPicture();
Bitmap songImage = BitmapFactory.decodeByteArray(arr, 0, arr.length);
imageView.setImageBitmap(songImage);
}catch (Exception d){
}
try {
TextView songName = (TextView) view.findViewById(R.id.song_name);
songName.setText(currentSong.getName());
}catch (Exception e){
}
try {
TextView duration = (TextView)view.findViewById(R.id.duration);
long durationString = currentSong.getDuration();
long min = durationString / 60000;
long sec = (durationString % 60000) / 1000;
duration.setText(min + ":" + sec);
}catch (Exception e){
}
try {
TextView artist = (TextView)view.findViewById(R.id.artist);
artist.setText(currentSong.getArtist());
}catch (Exception e){
}
return itemView;
}
@Override
public int getCount() {
return songs == null ? 0 : songs.size();
}
}
}