2013-12-17 89 views
1

我有一个列表,其中我从共享偏好获取的特定数字(位置)应该显示一个imageview(指示当前正在播放哪首歌曲)。但是我得到的位置,但该项目也显示在其他行。当我滚动列表时发生问题。Android列表视图行重复项目

*这是当我退出其他活动发生的事情,以及关于简历,我来这是我:

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

,这是它的外观:

enter image description here

+0

接受答案,如果你发现它的帮助完整。这不是一个巴伯店... – Triode

+0

@Triode如果你向下滚动,你会看到有一个公认的答案 –

回答

7

其因此声明

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

listview回收视图,所以如果你注意到第一行和最后一行显示相同。这是因为第一行循环到最后一排

您可以通过添加一个else到如果这样它看起来像

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

很容易 - 为什么我没有想到这一点:)谢谢! –