Android Listview行重复项

Dar*_*ski 1 java android android-listview android-adapter

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

*当我退出另一个活动时,就会发生这种情况,并且在我的简历上我会这样做:

@Override
protected void onResume() {
    super.onResume();
    if(AlbumDetails.mediaPlayer!=null)
    adapter = new PlaylistAdapter(this, songs);
    list.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是它的样子:

在此输入图像描述

tyc*_*czj 7

因为这个说法

if (playpos == position) {
        eq.setVisibility(View.VISIBLE);
    }
Run Code Online (Sandbox Code Playgroud)

listview会回收视图,因此如果您注意到第一行而最后一行显示相同的内容.那是因为第一行被回收到最后一行

你可以通过在if上添加一个else来解决这个问题

if (playpos == position) {
        eq.setVisibility(View.VISIBLE);
}else{
    eq.setVisibility(View.GONE);
}
Run Code Online (Sandbox Code Playgroud)