2015-06-03 46 views
2

我在我的列表视图中使用自定义适配器。当我在我的数组列表中打印出我的数据时,它会正确存储,但当我滚动项目时会重复。我知道我的getView方法有点混乱和混乱,但它为什么不正确地表示我的数据列表数据“oslist”?在ListView中滚动时重复的项目

这里是我的适配器代码:

public class WXYCAdapter extends BaseAdapter { 

private FragmentActivity context; 
private ArrayList<HashMap<String, String>> oslist; 
private ArrayList<HashMap<String, String>> heartList; 

private LayoutInflater mInflater; 

private final static int STREAM_LAYOUT = 0; 
private final static int TALKSET_LAYOUT = 1; 
private final static int BREAKPOINT_LAYOUT = 2; 
private final static int PLAYCUT_LAYOUT = 3; 
private final static int NULL_LAYOUT = 4; 

String URL; 
ViewHolder holder; 

public WXYCAdapter(FragmentActivity context, ArrayList<HashMap<String, String>> oslist) { 
    this.context = context; 
    this.oslist = oslist; 
    this.mInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 


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

@Override 
public Object getItem(int position) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public int getItemViewType(int position) { 

    int RETURN_LAYOUT = NULL_LAYOUT; 

    switch (oslist.get(position).get("layoutType")) { 
     case "LiveStream": 
      RETURN_LAYOUT = STREAM_LAYOUT; 
      break; 

     case "Playcut": 
      RETURN_LAYOUT = PLAYCUT_LAYOUT; 
      break; 

     case "Talkset": 
      RETURN_LAYOUT = TALKSET_LAYOUT; 
      break; 

     case "Breakpoint": 
      RETURN_LAYOUT = BREAKPOINT_LAYOUT; 
      break; 
    } 

    return RETURN_LAYOUT; 

} 

@Override 
public int getViewTypeCount() { 
    return 4; 
} 

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

    holder = null; 
    int type = getItemViewType(position); 

    if (convertView == null) { 
     holder = new ViewHolder(); 
     switch (type) { 
      case STREAM_LAYOUT: 
       convertView = mInflater.inflate(R.layout.listview_cell, null); 

       holder.cell_image = (ImageView) convertView.findViewById(R.id.cell_image); 
       holder.cell_image.setImageResource(R.drawable.boombox); 

       holder.song = (TextView) convertView.findViewById(R.id.song); 
       holder.artist = (TextView) convertView.findViewById(R.id.artist); 

       holder.song.setEnabled(false); 
       holder.song.setMaxHeight(0); 

       holder.artist.setEnabled(false); 
       holder.artist.setMaxHeight(0); 

       convertView.setTag(holder); 
       break; 

      case TALKSET_LAYOUT: 
       convertView = mInflater.inflate(R.layout.listview_cell, null); 

       holder.cell_image = (ImageView) convertView.findViewById(R.id.cell_image); 
       holder.cell_image.setImageBitmap(null); 
       holder.cell_image.setEnabled(false); 
       holder.cell_image.setMaxHeight(0); 
       holder.cell_image.setMaxWidth(0); 

       holder.song = (TextView) convertView.findViewById(R.id.song); 
       holder.artist = (TextView) convertView.findViewById(R.id.artist); 
       holder.song.setText("Talkset"); 
       holder.artist.setText(null); 

       holder.artist.setEnabled(false); 
       holder.artist.setMaxHeight(0); 

       convertView.setTag(holder); 
       break; 

      case BREAKPOINT_LAYOUT: 
       convertView = mInflater.inflate(R.layout.listview_cell, null); 

       holder.cell_image = (ImageView) convertView.findViewById(R.id.cell_image); 
       holder.cell_image.setImageBitmap(null); 
       holder.cell_image.setEnabled(false); 
       holder.cell_image.setMaxHeight(0); 
       holder.cell_image.setMaxWidth(0); 

       holder.song = (TextView) convertView.findViewById(R.id.song); 

       //holder.song.setTypeface(Typeface.createFromAsset(context.getAssets(), "default.ttf")); 

       holder.artist = (TextView) convertView.findViewById(R.id.artist); 
       holder.song.setText("Breakpoint"); 
       holder.artist.setText(null); 
       holder.artist.setEnabled(false); 
       holder.artist.setMaxHeight(0); 


       long l = Long.parseLong(oslist.get(position).get("hour")); 

       Calendar calendar = Calendar.getInstance(); 
       calendar.setTimeInMillis(l); 
       calendar.setTimeInMillis(l * 1000); 

       int hour = calendar.get(Calendar.HOUR); 

       convertView.setTag(holder); 
       break; 

      case PLAYCUT_LAYOUT: //Playcut 


       convertView = mInflater.inflate(R.layout.listview_cell, null); 


       //holder.cell_image = (ImageView) convertView.findViewById(R.id.cell_image); 

       //holder.cell_image.setImageResource(R.drawable.no_album_art); 

       holder.song = (TextView) convertView.findViewById(R.id.song); 
       holder.artist = (TextView) convertView.findViewById(R.id.artist); 

       holder.song.setText(oslist.get(position).get("songTitle")); 
       holder.artist.setText(oslist.get(position).get("artistName")); 

       convertView.setTag(holder); 
       break; 
      case NULL_LAYOUT: 
       convertView.setTag(holder); 
       break; 

     } 


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

    return convertView; 

} 

@Override 
public boolean hasStableIds(){ 
    return true; 
} 



public static class ViewHolder { 
    public TextView textView, song, artist; 


    public ImageView cell_image; 
    public Button playButton; 
} 

}

+0

我很确定你的示例代码可以从目前的198行(几乎6K字符)中缩减。请参阅[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – Jeeped

+0

我修好了!我只需将开关盒移到if-else语句下面。不完全确定为什么..但如果有人想解释,我很乐意学习 –

回答

2

列表视图应该重用的视图。因此,相同的视图可以用于列表中的其他项目。

的主要问题是,你正在改变视图的内容只有当视图是由于视图可重复使用空

错误的方式

If(convertView == null) { 
    //Inflate view 
    // Change view content 
} 

,它并不总是空。

如上所述,在将switch语句移至空值条件之外后,问题就已修复。

这种方式,视图内容将始终根据目前的项目(这是正确的)

正道

If(convertView == null) { 
    // inflate it 
} 
// Change view content 

这引起了混乱也向我一开始改变了... ... 查看被重用..但您应该相应地更改其内容。

+0

这个答案是现货。我唯一要添加的就是在If(convertView == null){//膨胀它}'< - 视图已创建,...以及在else {holder =(ViewHolder)convertView.getTag(); }'< - 视图已被回收。将你的开关移到if/else语句之后,返回之前,你就可以走了。 – kev