2014-06-25 31 views
0

请看看这个适配器,我有一个奇怪的问题,它从数据库读取数据,当行在列表视图的边框,他们是发现和没问题,但当他们走出列表视图边框(所以我不得不向下滚动),每一件事都混在一起,没有任何东西在它的位置上,你们有没有注意到这一点?当ListView项目出边框时奇怪的适配器反应

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

@Override 
public Object getItem(int position) { 
    return mCursor.getString(position); 
} 

@Override 
public long getItemId(int position) { 
    return mCursor.getPosition(); 
} 
// mCursor.getPosition() 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    if (convertView == null) { 

     holder = new ViewHolder(); 
     convertView = mLayoutInflater.inflate(R.layout.listitem_discuss, 
null); 
      this.convertview=convertView; 


    mCursor.moveToPosition(position); 

    holder.wrapper = (LinearLayout) convertView.findViewById(R.id.wrapper); 

    holder.theMessage = (TextView) convertView.findViewById(R.id.comment); 
    holder.theName = (TextView) convertView.findViewById(R.id.MSGname); 
    holder.theImage = (ImageView)convertView.findViewById(R.id.MSGimage); 

    android.widget.FrameLayout.LayoutParams lp = 
    (android.widget.FrameLayout.LayoutParams) holder.theName.getLayoutParams(); 



    String Namer= mCursor.getString(mCursor.getColumnIndex("username")); 
      String namer[] = Namer.split("\\@"); 
      String imagenamer=namer[0]; 

    holder.theName.setText(imagenamer); 

holder.theMessage.setText(mCursor.getString(mCursor.getColumnIndex("message"))); 

    int isright= 
Integer.valueOf(mCursor.getString(mCursor.getColumnIndex("isright"))); 

    if(isright==0){ 

     holder.theMessage.setBackgroundResource(R.drawable.bubble_yellow); 

     holder.wrapper.setGravity(Gravity.LEFT); 

     lp.gravity = Gravity.LEFT; 
     holder.theName.setLayoutParams(lp); 

     android.widget.FrameLayout.LayoutParams params = new 
android.widget.FrameLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT  ,Gravity.LEFT); 
     holder.theImage.setLayoutParams(params); 

     holder.theImage.setPadding(10,0,0,0); 
     holder.wrapper.setPadding(ImageWidth+10,40,0, 0); 
     holder.theName.setPadding(ImageWidth+25, 0,0, 0); 
     //(left, top, right, bottom) 
     File file= new File("storage/sdcard/LifeMatePrivate/ProfileImage 
/ProfileImage,imagechange_2,"+imagenamer+",.jpg"); 
     if(file.exists()){ 
     Picasso.with(mContext).load(new File("storage/sdcard 
/LifeMatePrivate/ProfileImage 
/ProfileImage,imagechange_2,"+imagenamer+",.jpg")).resize(ImageWidth, 
ImageHeight).centerCrop().into(holder.theImage); 
     }else{ 
     Picasso.with(mContext).load(new File("storage/sdcard 
/LifeMatePrivate/ProfileImage/Default.jpg")).resize(ImageWidth, 
ImageHeight).centerCrop().into(holder.theImage); 
     } 



    }else{ 

    holder.theMessage.setBackgroundResource(R.drawable.bubble_green); 

    holder.wrapper.setGravity(Gravity.RIGHT); 

    lp.gravity = Gravity.RIGHT; 
    holder.theName.setLayoutParams(lp); 

    android.widget.FrameLayout.LayoutParams params = new 
android.widget.FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
LayoutParams.WRAP_CONTENT 
,Gravity.RIGHT); 
    holder.theImage.setLayoutParams(params); 

    holder.theImage.setPadding(0,0,10,0); 
    holder.wrapper.setPadding(0,40, ImageWidth+10, 0); 
    holder.theName.setPadding(0, 0, ImageWidth+25, 0); 
    //(left, top, right, bottom) 
    File file= new File("storage/sdcard/LifeMatePrivate/ProfileImage 
/ProfileImage,imagechange_2,"+imagenamer+",.jpg"); 
    if(file.exists()){ 
    Picasso.with(mContext).load(new File("storage/sdcard/LifeMatePrivate 
/ProfileImage/ProfileImage,imagechange_2,"+imagenamer+",.jpg")).resize(ImageWidth, 
ImageHeight).centerCrop().into(holder.theImage); 
    }else{ 
    Picasso.with(mContext).load(new File("storage/sdcard/LifeMatePrivate 
/ProfileImage/Default.jpg")).resize(ImageWidth, 
ImageHeight).centerCrop().into(holder.theImage); 
    } 

    } 


    if(!mCursor.isLast()){ 
     mCursor.moveToNext(); 
    } 

    convertView.setTag((ViewHolder)holder); 

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

我认为这个问题必须与我的病情,如果{ mCursor.moveToNext(); } – user3764748

+0

我认为你可能是对的条件。我有一个类似的问题,因为我创建的条件不能正常工作getView – user3331142

+0

以及我认为当它到达列表的末尾,光标说终于im,所以不移动到下一个,这可能是问题,我已经寻找真正的答案并在找到时更新 – user3764748

回答

0

好,ViewHolder的目的是为了FindViewbyId()的每一次不叫,每当您查看滚出边界,机器人回收的观点,所以你必须重建它。通过改变getView像这样的第一部分解决了这一问题:(!mCursor.isLast())

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    if (convertView == null) { 
    System.out.println("convertview null"); 
     holder = new ViewHolder(); 
     convertView = mLayoutInflater.inflate(R.layout.listitem_discuss, null); 
      this.convertview=convertView; 




    holder.wrapper = (LinearLayout) convertView.findViewById(R.id.wrapper); 

    holder.theMessage = (TextView) convertView.findViewById(R.id.comment); 
    holder.theName = (TextView) convertView.findViewById(R.id.MSGname); 
    holder.theImage = (ImageView)convertView.findViewById(R.id.MSGimage); 


    convertView.setTag((ViewHolder)holder); 

    }else { 
     holder = (ViewHolder) convertView.getTag(); 
    System.out.println("convertview not null"); 
    } 
    ////rest of the code