2014-12-22 41 views
0

我正在用kinvey作为后端构建一个测试应用程序。我从后端下载kinvey实体并将它们添加到我的适配器中。适配器的行为错误,第一个数据实体被访问三次。Android:自定义适配器多次显示数据

的适配器的代码如下

public class ImageAdapter extends BaseAdapter { 
private static final String TAG = ImageAdapter.class.getSimpleName(); 
private static ImageFetcher mImageFetcher; 
private ArrayList<ImageEntity> mImageEntities; 
private Context mContext; 
private LayoutInflater mLayoutInflater; 

public ImageAdapter(Context context, ArrayList<ImageEntity> imageEntities) { 
    mContext = context; 
    mImageEntities = imageEntities; 
    mLayoutInflater = LayoutInflater.from(context); 
    mImageFetcher = new ImageFetcher(context); 
} 

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

@Override 
public Object getItem(int position) { 
    return mImageEntities.get(position); 
} 

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


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

    ViewHolder viewHolder = null; 

    if (convertView != null) { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } else { 
     convertView = mLayoutInflater.inflate(R.layout.grid_item_layout, parent, false); 
     viewHolder = new ViewHolder(convertView); 
     convertView.setTag(viewHolder); 
    } 
    ImageEntity imageEntity = mImageEntities.get(position); 
    Log.d(TAG, imageEntity.getId()); 
    viewHolder.textView.setText(imageEntity.getId()); 
    viewHolder.imageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_launcher)); 
    mImageFetcher.loadImage(viewHolder.imageView, imageEntity.getId()); 
    return convertView; 
} 


static class ViewHolder { 
    ImageView imageView; 
    TextView textView; 

    public ViewHolder(View v) { 
     imageView = (ImageView) v.findViewById(R.id.id_simple_image); 
     textView = (TextView) v.findViewById(R.id.textview); 

    } 

} 

}

该活动的代码是

public class ImageActivity extends ActionBarActivity { 
private static final int CAPTURE_IMAGE_REQUEST_CODE = 11; 
private static final int MEDiA_TYPE_IMAGE = 1; 
private static final int PICK_IMAGE = 2; 
private static final String TAG = ImageActivity.class.getSimpleName(); 

private Client mKinveyClient; 
private EntitySource mEntitySource; 
private Uri mFileUri; 
private GridView mGridView; 
private ImageAdapter mImageAdapter; 
private ArrayList<ImageEntity> mImageEntities; 

@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_image); 
    mEntitySource = EntitySource.getEntitySource(this); 
    mKinveyClient = TestApplication.getClientInstance(); 
    mGridView = (GridView) findViewById(R.id.gridview); 
    mImageEntities = new ArrayList<>(); 
    if (!mKinveyClient.user().isUserLoggedIn()) { 
     Intent intent = new Intent(this, LoginActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 
    } 
    mImageAdapter = new ImageAdapter(this, mImageEntities); 
    mGridView.setAdapter(mImageAdapter); 
} 

private void updateData() { 

    AsyncAppData<ImageEntity> events = mKinveyClient.appData("events", ImageEntity.class); 
    events.get(new KinveyListCallback<ImageEntity>() { 
     @Override 
     public void onSuccess(ImageEntity[] imageEntities) { 

      mImageEntities.addAll(Arrays.asList(imageEntities)); 
      for (ImageEntity imageEntity : imageEntities) { 
       System.out.println(imageEntity.getId()); 
      } 
      mImageAdapter.notifyDataSetChanged(); 

     } 

     @Override 
     public void onFailure(Throwable throwable) { 
      Log.d(TAG, "Fail " + throwable.getMessage()); 
     } 
    }); 

} 

日志:显示了三个实体下载,但在适配器的第一个实体访问三次。请帮忙

12-22 18:43:39.742: V/Kinvey - Client(16995): adding new instance of AppData, new collection name 
12-22 18:43:40.628: I/System.out(16995): 5497cdc4b76664a0030358a2 
12-22 18:43:40.628: I/System.out(16995): 5497cedfe21a6f05030016b8 
12-22 18:43:40.629: I/System.out(16995): 5498062bc0f22386510111b6 
12-22 18:43:40.635: D/ImageAdapter(16995): 5497cdc4b76664a0030358a2 
12-22 18:43:40.640: D/ImageAdapter(16995): 5497cdc4b76664a0030358a2 
12-22 18:43:40.641: D/ImageAdapter(16995): 5497cdc4b76664a0030358a2 
12-22 18:43:40.643: D/ImageAdapter(16995): 5497cedfe21a6f05030016b8 
+0

你在哪里调用updateData()? – Aashir

+0

我打电话给它的菜单项点击 – Aqib

回答

1

每次在updateData中获得结果时,都会添加到数组中。您需要每次重置收集,因此请先打电话清除:

 mImageEntities.clear(); 
     mImageEntities.addAll(Arrays.asList(imageEntities)); 
+0

你打我吧..伟大的工作 – Aashir

+0

我做到了,但我得到了同样的结果第一个实体再次重复 – Aqib

+0

更改循环,你在哪里登录:for(ImageEntity imageEntity:imageEntities) {枚举imageIntities的mImageEntities instezd。结果是什么? –