Android Listview row repeating item

主宰稳场 提交于 2019-12-01 10:28:22

问题


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:


回答1:


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. 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 (playpos == position) {
        eq.setVisibility(View.VISIBLE);
}else{
    eq.setVisibility(View.GONE);
}



回答2:


If you are extending BaseAdapter in you Adapter class then this solution will work. https://stackoverflow.com/a/28791031/4531507



来源:https://stackoverflow.com/questions/20637978/android-listview-row-repeating-item

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!