ArrayAdapter位置错误

时间:2014-08-02 20:37:01

标签: java android listview

公共类SongListAdapter_AddMode扩展了ArrayAdapter {

Context context;
ArrayList<Song> songs;

public SongListAdapter_AddMode(Context context, ArrayList<Song> songs) {
    super(context, R.layout.list_item1_addmode, songs );
    this.songs = songs;
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){

    ViewHolder holder;
    final int pos = position;
    Log.d("TAG", "position :" + position);
    Song currentSong = songs.get(position);
    Log.d("TAG", "position : " + position );

    if( convertView == null ){
        holder = new ViewHolder();

        convertView = LayoutInflater.from(context).inflate( R.layout.list_item1_addmode, parent, false );

        holder.titleLabel = (TextView) convertView.findViewById( R.id.topLabel );
        holder.artistLabel = (TextView) convertView.findViewById( R.id.bottomLabel );
        holder.cover = (ImageView) convertView.findViewById( R.id.list_image );
        holder.button = (ImageView) convertView.findViewById(R.id.addButton);
        holder.button.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d("TAG", "pos" + pos );
            }
        });
        convertView.setTag(holder);

    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    Uri coverPath = ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), currentSong.getID() );

    Picasso.with(context).load( coverPath ).error( R.drawable.untitled ).into( holder.cover );
    holder.titleLabel.setText( currentSong.getName() );
    holder.artistLabel.setText( currentSong.getArtistName() );

    return convertView;
}

private class ViewHolder {
    TextView titleLabel;
    TextView artistLabel;
    ImageView cover;
    ImageView button;
}

}

这是ArrayAdapter的一个小例子。正如您在getView()方法中看到的那样,我从一个实际上非常庞大的列表中获取currentSong。它包含1600~Songs。当我将位置打印到LogCat时,它会显示0到7。如何在歌曲列表中找到正确的位置,但是当我打印它时,它是完全不同的?

我总是得到正确的歌曲。即使在900~及以上。但是位置(LogCat)总是从0到7 ......

我需要获取当前行。我想在此方法中向当前onClickListener()的按钮添加View,当我点击它时,我想要使用onItemClickListener()上的ListView做一些我无法做的事情。

3 个答案:

答案 0 :(得分:2)

似乎您设置按钮单击侦听器以打印可循环视图的位置,从而获得0-7。

而是将侦听器设置在if (convertview == null)检查之外。

答案 1 :(得分:0)

  

我总是得到正确的歌曲

当然,因为代码是正确的

  

但是位置(LogCat)总是从0到7 ......

这是由于ListView如何回收其行。您可以在测试设备的屏幕上看到7个项目。见this post

答案 2 :(得分:0)

您应该覆盖getCount

@Override
public int getCount(){
    return songs.size();
}

因为正确显示列表至关重要,但默认返回0。