简体   繁体   中英

query() method of Content provider returns data twice in recycler View adapter

I am working on a android project, here i have a class CategoryProvider which extends ContentProvider class and i also implements LoaderManager.LoaderCallbacks<Cursor> in my main Activity and I also have CategoryAdapter class which extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> . I have 3 records in my Sqlite database, now after initialization of Loader in main Activity when data is loading in the adapter it loads each record twice so how to fix that.

CategotyAdapter.java

public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> {
    Cursor dataCursor;
    Context context;
    String global_lang = "English";

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView name;
        ImageView imageView;

        public ViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.titleText);
            imageView = (ImageView) itemView.findViewById(R.id.icons);
        }
    }

    public CategoryAdapter(Activity mContext, Cursor cursor) {
        dataCursor = cursor;
        context = mContext;
    }

    @Override
    public CategoryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View cardview = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.option_layout, parent, false);
        return new ViewHolder(cardview);
    }

    @Override
    public void onBindViewHolder(CategoryAdapter.ViewHolder holder, int position) {

        dataCursor.moveToPosition(position);

        String imagePath = dataCursor.getString(dataCursor.getColumnIndex(CategoryContract.CategoryEntry.COLUMN_IMAGE_PATH));
        String cEn_name = dataCursor.getString(dataCursor.getColumnIndex(CategoryContract.CategoryEntry.COLUMN_CONTENT_EN));
        String cHi_name = dataCursor.getString(dataCursor.getColumnIndex(CategoryContract.CategoryEntry.COLUMN_CONTENT_HI));

        if(global_lang.equals("English"))
            holder.name.setText(cEn_name);
        else
            holder.name.setText(cHi_name);

        Glide.with(context)
                .load(imagePath)
                .apply(new RequestOptions()
                .placeholder(R.drawable.loading))
                .into(holder.imageView);

    }

    public Cursor swapCursor(Cursor cursor) {
        if(dataCursor == cursor) {
            return null;
        }
        Cursor oldCursor = dataCursor;
        this.dataCursor = cursor;
        if(cursor != null) {
            this.notifyDataSetChanged();
        }
        return oldCursor;
    }

    @Override
    public int getItemCount() {
        if(dataCursor != null)
            Log.d("datacursor count", " " +dataCursor.getCount());
        else
            Log.d("datacursor count", "datacursor is null");

        return (dataCursor == null) ? 0 : dataCursor.getCount();
    }

    public void changeLang(String lang) {
        this.global_lang = lang;
    }

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

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    firstTimeUser();
    ActivityToolbar =  (Toolbar) findViewById(R.id.toolbar);
    ActivitySpinner = (Spinner) findViewById(R.id.spinner);

    ActivityToolbar.setTitle(R.string.app_name);
    ActivityAdapter = ArrayAdapter.createFromResource(this, R.array.languages, R.layout.drop_menu);
    ActivityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ActivitySpinner.getBackground().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP);
    ActivitySpinner.setAdapter(ActivityAdapter);

    listeners();

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);

    if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
    } else {
        recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
    }

    categoryAdapter = new CategoryAdapter(this, null);
    recyclerView.setAdapter(categoryAdapter);

    getLoaderManager().initLoader(CATEGORY_LOADER, null, this);
}

public void listeners() {
    ActivitySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            categoryAdapter.changeLang(ActivitySpinner.getSelectedItem().toString());
                getLoaderManager().restartLoader(CATEGORY_LOADER, null, MainActivity.this);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {


    String[] data = {
                CategoryContract.CategoryEntry._ID,
                CategoryContract.CategoryEntry.COLUMN_IMAGE_PATH,
                CategoryContract.CategoryEntry.COLUMN_CONTENT_EN,
                CategoryContract.CategoryEntry.COLUMN_CONTENT_HI
    };

    return new CursorLoader(
            this,
            CategoryContract.CategoryEntry.CONTENT_URI,
            data,
            null,
            null,
            null
    );
}

@Override
protected void onResume() {
    super.onResume();
    loader_flag = 0;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    categoryAdapter.swapCursor(data);

}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    categoryAdapter.swapCursor(null);
}

Thanks!!

Ok, I got it after a lot of debugging. Here I am using Sync Adapter framework in my App which syncs the data at the background, when it trying to reload data the duplicate data is synced rapidly with new ID and it was rendered by recyclerView . so now I am using some constraints and changing my Database structure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM