Android 自定义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);

我使用了一个定制的listview,但是大多数项目在开始时都会显示它们的默认值,直到我向下滚动,同时滚动项目的一部分数据,另一部分显示默认值

例如:

适配器代码:

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

    }
}