android - 我想在当前播放的歌曲上绘制小图标。使用 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(); 时遇到问题;列表视图没有更新。
非常感谢任何人的任何帮助或任何参与。
解决方案
我建议您使用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 中有两种常用的方法来更新视图。
- notifyDataSetChanged() 更新所有列表。
- notifyItemChaged(int postion) 更新特定项目
推荐阅读
- r - ymax 和 ymin 值(在错误栏中)不会出现在 geompoint 中
- sql - 如何在sql中将过滤器分配给行号()函数
- javascript - HTML表格中的嵌套for循环
- node.js - 从不同的 url 页面获取数据库数据——最好的技术是什么?
- character-encoding - 如何在 Mac 10.14.6 Mojave 中使用路径文件中的“应用程序支持”设置环境变量?
- object-detection - 用于地面实况跟踪的多目标跟踪 (MOT) 基准数据集格式
- javascript - 限制正则表达式中的字符总数
- excel - 忽略零时的最小值
- android - 如何压缩图像?
- javascript - 如何解决“未捕获的类型错误:无法读取 null 的属性‘值’”