为什么Listview使用自定义适配器android显示重复条目?
我创建了与listview绑定的自定义适配器,但它在listview中显示重复的歌曲。请检查代码,如果有什么问题请告诉我为什么Listview使用自定义适配器android显示重复条目?,android,listview,Android,Listview,我创建了与listview绑定的自定义适配器,但它在listview中显示重复的歌曲。请检查代码,如果有什么问题请告诉我 public class UnfavoriteSongAdapter extends BaseAdapter { private Activity activity; private ArrayList<Media> data; private static LayoutInflater inflater = null; private Context co
public class UnfavoriteSongAdapter extends BaseAdapter
{
private Activity activity;
private ArrayList<Media> data;
private static LayoutInflater inflater = null;
private Context context;
public UnfavoriteSongAdapter(Context context, Activity a, ArrayList<Media> d) {
activity = a;
this.context = context;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
GenreFavoriteClickListner genreFavoriteClickListner;
public interface GenreFavoriteClickListner {
public void onFavoriteClickListner(int position,Media media);
}
public void setGenreFavoriteClickListner(GenreFavoriteClickListner genreFavoriteClickListner) {
this.genreFavoriteClickListner = genreFavoriteClickListner;
}
public static class ViewHolder {
public TextView textView_title, textView_artist, textView_time;
public CircleImageView circleImageView_albumphoto, circleImageView_favorite;
public ImageView imageView_play;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
final ViewHolder viewHolder;
try {
if (convertView == null) {
viewHolder = new ViewHolder();
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
} else {
viewHolder = (ViewHolder) vi.getTag();
}
if (data.size() <= 0) {
//viewHolder.textview_albumtitle.setText("No Appointment");
} else {
final Media p = data.get(position);
viewHolder.textView_title.setText(p.getSongName());
viewHolder.textView_artist.setText(p.getArtistName());
long millis = Long.parseLong(p.getDuration());
String hms = ReusableModules.getCalculatedTime(millis);
viewHolder.textView_time.setText(hms);
String isplaying = p.getIsPlaying();
int playingid = R.mipmap.play;
if (isplaying != null) {
if(isplaying.contentEquals(Constants.ONE)){
playingid = R.mipmap.runing_music_play;
}
}
viewHolder.imageView_play.setImageResource(playingid);
ReusableModules.setFavoriteToggleButton(p.getIsFavorite(), viewHolder.circleImageView_favorite);
viewHolder.circleImageView_favorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (genreFavoriteClickListner != null) {
genreFavoriteClickListner.onFavoriteClickListner(position,p);
}
}
});
final String finalUrl = p.getAlbumUrl();
viewHolder.circleImageView_albumphoto.post(new Runnable() {
@Override
public void run() {
BaseActivity.imageLoader.displayImage(finalUrl,
viewHolder.circleImageView_albumphoto, SplashScreenActivity.displayImageOptions, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(Bitmap loadedImage) {
}
});
}
});
vi.setTag(p);
}
} catch (Exception e) {
}
return vi;
}
}
公共类不受欢迎SongAdapter扩展BaseAdapter
{
私人活动;
私有数组列表数据;
专用静态充气机=空;
私人语境;
公共不受欢迎的SongAdapter(上下文、活动a、ArrayList d){
活动=a;
this.context=上下文;
数据=d;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
GenreFavoriteClickListner GenreFavoriteClickListner;
公共接口GenreFavoriteClickListner{
FavoriteClicklistner上的公共无效(int位置,媒体);
}
public void setGenreFavoriteClickListner(GenreFavoriteClickListner GenreFavoriteClickListner){
this.genreFavoriteClickListner=genreFavoriteClickListner;
}
公共静态类视图持有者{
公共文本视图文本视图标题、文本视图艺术家、文本视图时间;
公共CircleImageView CircleImageView_相册照片,CircleImageView_收藏夹;
公共图像查看图像查看播放;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图vi=转换视图;
最终持票人;
试一试{
if(convertView==null){
viewHolder=新的viewHolder();
最终LayoutFlater充气器1=(LayoutFlater)activity.getSystemService(Context.LAYOUT\u充气器\u服务);
vi=充气机1.充气(R.layout.song\u listitem\u layout,null);
viewHolder.textView\u title=(textView)vi.findViewById(R.id.textView\u song\u songname);
viewHolder.textView\u artist=(textView)vi.findViewById(R.id.textView\u song\u artistname);
viewHolder.textView\u time=(textView)vi.findViewById(R.id.textView\u song\u time);
viewHolder.circleImageView\u albumphoto=(circleImageView)vi.findViewById(R.id.circleImageView\u Now playing\u playing);
viewHolder.circleImageView\u favorite=(circleImageView)vi.findViewById(R.id.circleImageView\u song\u favorite);
viewHolder.imageView\u play=(imageView)vi.findViewById(R.id.imageView\u song\u playpause);
}否则{
viewHolder=(viewHolder)vi.getTag();
}
如果(data.size()在内部添加vi.setTag(p):
if(convertView == null){
vi.setTag(p);
}
在内部添加vi.setTag(p):
if(convertView == null){
vi.setTag(p);
}
移动
vi.setTag(viewholder);
里面
if(convert==null){
viewHolder = new ViewHolder();
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
// here
vi.setTag(viewholder);
}
并删除此项:
final String finalUrl = p.getAlbumUrl();
viewHolder.circleImageView_albumphoto.post(new Runnable() {
@Override
public void run() {
BaseActivity.imageLoader.displayImage(finalUrl,
viewHolder.circleImageView_albumphoto, SplashScreenActivity.displayImageOptions, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(Bitmap loadedImage) {
}
});
}
});
remove this **vi.setTag(p);**
移动
vi.setTag(viewholder);
里面
if(convert==null){
viewHolder = new ViewHolder();
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
// here
vi.setTag(viewholder);
}
并删除此项:
final String finalUrl = p.getAlbumUrl();
viewHolder.circleImageView_albumphoto.post(new Runnable() {
@Override
public void run() {
BaseActivity.imageLoader.displayImage(finalUrl,
viewHolder.circleImageView_albumphoto, SplashScreenActivity.displayImageOptions, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(Bitmap loadedImage) {
}
});
}
});
remove this **vi.setTag(p);**
对getView()方法进行如下更改
viewHolder = new ViewHolder();
if (convertView == null) {
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
把这个拿走
else {
viewHolder = (ViewHolder) vi.getTag();
}
在getView()方法的最后一部分
试试这个,告诉我它是否有效?对getView()方法进行如下更改
viewHolder = new ViewHolder();
if (convertView == null) {
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
把这个拿走
else {
viewHolder = (ViewHolder) vi.getTag();
}
在getView()方法的最后一部分
试试这个,告诉我它是否有效?如果视图持有者为空,则为视图持有者设置标记。添加最后一行代码
if (convertView == null) {
viewHolder = new ViewHolder();
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
/************ Set holder with LayoutInflater ************/
vi.setTag( viewHolder );
}
//检查数据大小getCount,这是一个很好的做法。不在getview方法中
@Override
public int getCount() {
if(data!=null && data.size()> 0)
return data.size();
else
return 0;
}
我建议您替换getview方法并检查数据一次,因为您的适配器代码看起来很完美。如果视图持有者为空,请为视图持有者设置标记。添加最后一行代码
if (convertView == null) {
viewHolder = new ViewHolder();
final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater1.inflate(R.layout.song_listitem_layout, null);
viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname);
viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname);
viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time);
viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing);
viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite);
viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause);
/************ Set holder with LayoutInflater ************/
vi.setTag( viewHolder );
}
//检查数据大小getCount,这是一个很好的做法。不在getview方法中
@Override
public int getCount() {
if(data!=null && data.size()> 0)
return data.size();
else
return 0;
}
我建议您更换getview方法并检查您的数据一次,因为您的适配器代码看起来很完美。我知道他在if块之后设置标记,所以他将如何获得标记,请检查OP提供的代码这里是v1.setTag(p)在ConvertView的if块中,我将媒体对象设置为标记,因为我在单击项目时需要该对象。当你单击项目时,你获得位置,并且从该位置可以从arraylistYeah检索项目。你是对的。但是你的解决方案在这里不起作用。我知道他正在设置if块后的标记,因此他将如何获得标记,请检查代码OP给出了v1.setTag(p)在ConvertView的if块中,我将媒体对象设置为标记,因为我在单击项时需要该对象。当您单击项时,您可以获得位置,并且从该位置可以从arraylistYeah检索项。您是对的。但是您的解决方案在这里不起作用。当我使用自定义适配器与listview绑定时,它会在每7t后复制项h位置。这可能有助于您了解更多有关问题的信息。我早些时候尝试了您的第一个解决方案,它正在工作。谢谢-无当我使用自定义适配器与listview绑定时,它会在每第7个位置后显示重复项。这可能有助于您了解更多有关问题的信息。我早些时候尝试了您的第一个解决方案,它正在工作。谢谢-无正在工作。当我使用自定义适配器与listview绑定时,它会在每7个位置后复制项目。这可能有助于您了解更多有关问题的信息尝试此@DharmeshDhameliyaI尝试了此解决方案并进行了一些其他更改。然后它就工作了。谢谢--Dalvinder SinghIt不工作。当我使用自定义适配器与listview绑定时当它在每7个位置后复制项目时。这可能会帮助您了解更多问题尝试这个@DharmeshDhameliyaI尝试了这个解决方案并做了一些其他更改。然后它成功了。谢谢——Dalvinder Singh