简体   繁体   English

Android Listview行重复项

[英]Android Listview row repeating item

I have a list where on specific number(position) that i get from shared preferences an imageview should be shown(indicates what song is currently playing) . 我有一个列表,在此列表中应显示从共享的首选项获取的特定数字(位置)(表示当前正在播放的歌曲)。 But i get the position,but that item is showing on other rows as well. 但是我得到了职位,但是该项目也在其他行上显示。 The problem is occurring when i scroll the list. 当我滚动列表时出现问题。

*This is happening when i exit another activity, and on my on resume i to this: *这是在我退出另一项活动时发生的,并且在我的履历表中我看到以下内容:

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

Here is my code: 这是我的代码:

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;
    }
}

And this is how it looks: 这是它的外观:

在此处输入图片说明

its because of this statement 因为这个说法

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

the listview recycles views so if you notice the first row and the last row is showing the same. listview会回收视图,因此如果您注意到第一行和最后一行显示的是相同的视图。 That is because the first row was recycled to the last row 那是因为第一行被回收到最后一行

you can fix this by adding an else onto the if so it would look like 您可以通过在if上添加else来解决此问题

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

If you are extending BaseAdapter in you Adapter class then this solution will work. 如果要在Adapter类中扩展BaseAdapter ,则此解决方案将起作用。 https://stackoverflow.com/a/28791031/4531507 https://stackoverflow.com/a/28791031/4531507

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM