首页 > 解决方案 > 我想在当前播放的歌曲上绘制小图标。使用 notifyDataSetChanged() 时 Listview 不更新新更改

问题描述

嗨,我开发了媒体播放器,它可以播放原始文件中的歌曲。我有带有歌曲列表的列表视图。我可以在当前播放的歌曲上绘制小图标,但是当我将列表视图向上滚动到顶部或向下滚动到底部时,该图标会消失。我希望小图标留在正在播放的歌曲上,并在下一首歌曲开始播放时从当前歌曲中删除并设置为新歌曲。

Evrything 工作正常,但 Listview 未更新。

这是适配器

public class SongAdapter extends BaseAdapter {

    private int[] iconImage;
    private String[] indexText;
    private String[] englishText;


    private LayoutInflater myInflater;


    //Constructor
    public SongAdapter(Context c, String[] aIndexText, String[] aEnglishText, 
                       int[] aIconImage) {

        iconImage = aIconImage;
        indexText = aIndexText;
        englishText = aEnglishText;
        myInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    @Override
    public int getCount() {
        return englishText.length;
    }




    @Override
    public Object getItem(int position) {
        return indexText[position] + " " + englishText[position];
    }

   @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        View myView = myInflater.inflate(R.layout.songs_detail_layout, null);

        ImageView iconImageView = myView.findViewById(R.id.iconImageView);
        TextView indexTextView = myView.findViewById(R.id.IndexTextView);
        TextView englishTextView = myView.findViewById(R.id.englishTextView);


        iconImageView.setImageResource(iconImage[position]);
        indexTextView.setText(indexText[position]);
        englishTextView.setText(englishText[position]);

        //Make all icons invisible
        iconImageView.setVisibility(View.INVISIBLE);

        return myView;
    }
}

这是主要活动

公共类 MainActivity 扩展 AppCompatActivity {

        private SongAdapter mySongAdapter;
        private Field[] fields;
        private MediaPlayer mp;
        private ListView lv;


        private ArrayList<String> myArrayList=new ArrayList<>();

        private Button btnPlay;
        private Button btnNxt;
        private Button btnRep;
        private Button btnShuf;
        private Button btnAto;
        private TextView elapsedTimeLabel;
        private TextView remainingTimeLabel;
        private SeekBar seekBar = null;
        private int resId = 0;
        private int position = 0;
        private int newPosition = 0;
        private Toast toast;
        private TextView titleTextView;
        private Boolean shuffle = false; 
        private Boolean paused = false;
        private Boolean isAuto = false; 
        private volatile Boolean stopThread = false;
        private Random rand = new Random();


        private ImageView indexImageView;





        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);


            try {

                lv = findViewById(R.id.songsListView);

                int[] iconImage = {R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp,
                        R.drawable.ic_play_circle_outline_white_24dp
                };

                String[] indexText = getResources().getStringArray(R.array.indexText);
                String[] englishText = getResources().getStringArray(R.array.englishText);

                seekBar = findViewById(R.id.seekBar);

                btnPlay = findViewById(R.id.btnPlay);
                btnNxt = findViewById(R.id.btnNxt);
                Button btnPv = findViewById(R.id.btnPv);
                Button btnFF = findViewById(R.id.btnFF);
                Button btnFB = findViewById(R.id.btnFB);
                btnRep = findViewById(R.id.btnRep);
                btnShuf = findViewById(R.id.btnShuf);
                btnAto = findViewById(R.id.btnAuto);

                elapsedTimeLabel = findViewById(R.id.elapsedTimeLabel);
                remainingTimeLabel = findViewById(R.id.remainingTimeLabel);
                titleTextView = findViewById(R.id.titleTextView);

                indexImageView = findViewById(R.id.iconImageView);




                mySongAdapter = new SongAdapter(this, indexText, englishText, iconImage);

                lv.setAdapter(mySongAdapter);

            }catch (NullPointerException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }


            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                    try {

                        if (resId == position) {
                            view.findViewById(R.id.iconImageView).setVisibility(View.VISIBLE);
                        } else {
                            view.findViewById(R.id.iconImageView).setVisibility(View.INVISIBLE);
                        }

                        mySongAdapter.notifyDataSetChanged();


                        lv.setFastScrollEnabled(true);
                        lv.isScrollingCacheEnabled();
                    } catch (NullPointerException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

实际上我想实现这个解决方案,我在这里找到了如何在 android 的 listview 中设置当前播放歌曲的图标?

将图标添加到您的列表视图使其不可见,然后在 java 中编写代码

if(SongIndex !=position){
Image.setvisibility(View.Invisible)
}
else{
Image.setvisibility(View.Visible)
}
notifydatasetchanged();

我想我做了所有这些,但是在调用 notifydatasetchanged(); 时遇到问题;列表视图没有更新。

非常感谢任何人的任何帮助或任何参与。

标签: androidlistviewmedia-player

解决方案


我建议您使用RecyclerView而不是ListView并仅使用一个ArrayList与您的所有实体的自定义对象,就像这样。

public class Song {
private int imageIcon;
private String indexText;
private String englishText;
private String arabicText;


public Song(int imageIcon, String indexText, String englishText, String arabicText) {
    this.imageIcon = imageIcon;
    this.indexText = indexText;
    this.englishText = englishText;
    this.arabicText = arabicText;
}

public int getImageIcon() {
    return imageIcon;
}

public void setImageIcon(int imageIcon) {
    this.imageIcon = imageIcon;
}

public String getIndexText() {
    return indexText;
}

public void setIndexText(String indexText) {
    this.indexText = indexText;
}

public String getEnglishText() {
    return englishText;
}

public void setEnglishText(String englishText) {
    this.englishText = englishText;
}

public String getArabicText() {
    return arabicText;
}

public void setArabicText(String arabicText) {
    this.arabicText = arabicText;
} }

像这样使用这个数据源。

ArrayList 歌曲=新的 ArrayList();

在 Recyclerview 中有两种常用的方法来更新视图。

  1. notifyDataSetChanged() 更新所有列表。
  2. notifyItemChaged(int postion) 更新特定项目

推荐阅读