Android Listview 行重复项

Posted

技术标签:

【中文标题】Android Listview 行重复项【英文标题】:Android Listview row repeating item 【发布时间】:2014-01-05 10:34:56 【问题描述】:

我有一个列表,在我从共享首选项中获得的特定数字(位置)上应该显示一个图像视图(指示当前正在播放的歌曲)。但我得到了位置,但该项目也显示在其他行上。滚动列表时出现问题。

*当我退出另一个活动时会发生这种情况,并且在我恢复时我会这样做:

@Override
protected void onResume() 
    super.onResume();
    if(AlbumDetails.mediaPlayer!=null)
    adapter = new PlaylistAdapter(this, songs);
    list.setAdapter(adapter);

这是我的代码:

public class PlaylistAdapter extends BaseAdapter 

    private Activity activity;
    private static LayoutInflater inflater = null;
    private ArrayList<Songs> data;
    private DatabaseHelper db;
    private SharedPreferences prefs;
    int playpos;

    public PlaylistAdapter(Activity a, ArrayList<Songs> songs) 
        activity = a;
        data = songs;
        db = new DatabaseHelper(a);
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        prefs = activity.getSharedPreferences("com.darkovski.quran",
                Context.MODE_PRIVATE);
        playpos = prefs.getInt("posPlaying", -1);
    

    public int getCount() 
        return data.size();
    

    public Object getItem(int position) 
        return position;
    

    public long getItemId(int position) 
        return position;
    

    public View getView(final int position, View convertView,
            final ViewGroup parent) 
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.song_item, parent, false);

        ImageView download = (ImageView) vi
                .findViewById(R.id.playlist_item_download);
        db.openDB();
        if (db.isDownloaded(data.get(position).getNumber(), data.get(position)
                .getRecitorName(), data.get(position).getRecitorID()))
            download.setImageResource(R.drawable.download_yes);
        else 
            download.setImageResource(R.drawable.download_no);
            download.setOnClickListener(new OnClickListener() 
                @Override
                public void onClick(View v) 

                    new DownloadFileFromURL(activity, data.get(position)
                            .getRecitorName(), data.get(position).getTitle(),
                            data.get(position).getLink(), data.get(position)
                                    .getNumber(), data.get(position)
                                    .getRecitorID()).execute();
                    if (!db.isDBOpen())
                        db.openDB();
                    db.addDownloaded(data.get(position).getNumber(),
                            data.get(position).getLink(), 0, data.get(position)
                                    .getRecitorID(), "", data.get(position)
                                    .getTitle());

                    Toast.makeText(activity,
                            "Downloading " + data.get(position).getTitle(),
                            Toast.LENGTH_SHORT).show();

                
            );
        
        db.closeDB();

        TextView number = (TextView) vi.findViewById(R.id.playlist_item_num);
        TextView title = (TextView) vi.findViewById(R.id.playlist_item_reciter);
        title.setText(data.get(position).getTitle());
        number.setText((position + 1) + "");
        ImageView eq = (ImageView) vi.findViewById(R.id.playlist_item_equlizer);
        //this is where i show the item
        if (playpos == position) 
            eq.setVisibility(View.VISIBLE);
        

        return vi;
    

这就是它的外观:

【问题讨论】:

如果您发现它有帮助,请接受答案。这不是巴伯店…… @Triode 如果你向下滚动你会看到有一个接受的答案 【参考方案1】:

因为这句话

if (playpos == position) 
        eq.setVisibility(View.VISIBLE);
    

列表视图回收视图,因此如果您注意到第一行和最后一行显示相同。那是因为第一行被回收到了最后一行

你可以通过在 if 上添加 else 来解决这个问题,这样它看起来像

if (playpos == position) 
        eq.setVisibility(View.VISIBLE);
else
    eq.setVisibility(View.GONE);

【讨论】:

太容易了——为什么我没想到 :) 谢谢!【参考方案2】:

如果您在 Adapter 类中扩展 BaseAdapter,那么此解决方案将起作用。 https://***.com/a/28791031/4531507

【讨论】:

以上是关于Android Listview 行重复项的主要内容,如果未能解决你的问题,请参考以下文章

避免将重复项添加到 listview android

Android:如何删除 ListView 中的选中行?

android listView 怎么指定项的背景设置

android ListView 做下拉刷新 下拉跳到第一项怎么解决

android ListView 做下拉刷新 下拉跳到第一项怎么解决

如何在android中获取主屏幕小部件列表项的点击事件[重复]