Android : custom adapter showing data multiple times

296 Views Asked by At

I am building a test application with kinvey as a backend.I download the kinvey entities from the backend and add them to my adapter.The adapter behaves wrongly the first data entity is accessed three times.

The code for adapter is below

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);

    }

}

}

The code for the Activity is

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());
        }
    });

}

Log: shows three entities are downloaded but in adapter the first entity is accessed three times.Please help

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
1

There are 1 best solutions below

6
On

You are adding to the array every time you get results back in updateData. You need to reset the collection each time, so call clear first:

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