ClickListener при работе со списком из курсора

289
07 июня 2018, 08:50

Система следующая. Загружаются данные из курсора в ресайклер. Проблема заключается в том, что почему то при нажатии, система не видит нажатый пункт.Насколько я понимаю, не передается позиция.

Код фрагмента

public class FavouritesFragment extends Fragment implements FavouritesAdapter.ItemClickListener {
    RecyclerView recyclerView;
    View view;
    Toolbar toolbar;
    ArrayList<FavouriteModel> favouritesList;
    FavouritesAdapter favouritesAdapter;
    /**
     * DB
     */
    private SQLiteDatabase mDb;
    FavouritesDbHelper favouritesDbHelper;

    public FavouritesFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_favourites, container, false);
        toolbar = (Toolbar) view.findViewById(R.id.main_toolbar);
        ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
        /**
         * DB
         */
        favouritesDbHelper = new FavouritesDbHelper(getActivity());
        mDb = favouritesDbHelper.getWritableDatabase();
        Cursor cursor = getFavouriteCursor();
        Log.d("tag", "---Number of rows--- " + cursor.getCount());
        favouritesList = new ArrayList<>();
        favouritesAdapter = new FavouritesAdapter(getActivity(), cursor, setOnItemClickCallback());
        recyclerView = view.findViewById(R.id.recycler_favourites);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
        recyclerView.setAdapter(favouritesAdapter);
        return view;
    }
    /**
     * DB
     */
    private Cursor getFavouriteCursor(){
        return mDb.query(
                Contract.TableInfo.TABLE_NAME,
                null,
                null,
                null,
                null,
                null,
                null
        );
    }
    private OnItemClickListener.OnItemClickCallback setOnItemClickCallback() {
        OnItemClickListener.OnItemClickCallback onItemClickCallback = new OnItemClickListener.OnItemClickCallback() {
            @Override
            public void onItemClicked(View view, int position) {
                Log.d("click", "Fav - onItemClicked realisation " + position);
                FavouriteModel itemClicked = favouritesList.get(position);
                Log.d("click", "Fav -  FavouriteModel itemClicked " + itemClicked.toString());
                Bundle bundle = new Bundle();
                bundle.putString("title", itemClicked.getTitle());
                Log.d("click", "Fav - title, itemClicked.getTitle() " + itemClicked.getTitle());
                bundle.putString("overview", itemClicked.getOverview());
                bundle.putString("release_date", itemClicked.getRelease_date());
                bundle.putString("vote_average", itemClicked.getVote_average().toString());
                bundle.putString("poster_path", itemClicked.getPoster_path());
                bundle.putString("id", itemClicked.getId().toString());
                DetailedFragment detailedFragment = new DetailedFragment();
                detailedFragment.setArguments(bundle);
                FragmentManager manager = getActivity().getSupportFragmentManager();
                FragmentTransaction transaction = manager.beginTransaction();
                transaction.addToBackStack(null);
                transaction.replace(R.id.main_frame_list, detailedFragment);
                transaction.commit();
            }
        };
        return onItemClickCallback;
    }
    @Override
    public void onItemClick(View view, int position) {
        Log.d("click", "Fav - in Fragment some onItemClick method for what???");
    }
}

Код адаптера

public class FavouritesAdapter extends RecyclerView.Adapter<FavouritesAdapter.FavouritesViewHolder> {
    private ItemClickListener mClickListener;
    OnItemClickListener.OnItemClickCallback onItemClickCallback;
    Cursor mCursor;
    private Context mContext;
    public FavouritesAdapter(Context context, Cursor cursor,
                             OnItemClickListener.OnItemClickCallback onItemClickCallback) {
        this.mCursor = cursor;
        this.onItemClickCallback = onItemClickCallback;
        this.mContext = context;
    }
    @NonNull
    @Override
    public FavouritesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_banner, parent, false);
        return new FavouritesViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull FavouritesViewHolder holder, int position) {
        if(mCursor.moveToPosition(position)){
            String path = mCursor.getString(mCursor.getColumnIndex(Contract.TableInfo.COLUMN_POSTER_PATH));
            Log.d("tag", "------> Poster path is " + path);
            Picasso.get()
                    .load(path)
                    .into(holder.mImageBanner);
        }
        holder.mImageBanner.setOnClickListener(new OnItemClickListener(position, onItemClickCallback));
    }
    @Override
    public int getItemCount() {
        return mCursor.getCount();
    }
    public class FavouritesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        ImageView mImageBanner;
        public FavouritesViewHolder(View itemView) {
            super(itemView);
            mImageBanner = (ImageView) itemView.findViewById(R.id.item_banner_image);
            itemView.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
        }
    }
    public void setClickListener(FavouritesAdapter.ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

Код листенера

public class OnItemClickListener implements View.OnClickListener {
private int position;
private OnItemClickCallback onItemClickCallback;
public OnItemClickListener(int position, OnItemClickCallback onItemClickCallback) {
    this.position = position;
    this.onItemClickCallback = onItemClickCallback;
}
@Override
public void onClick(View view) {
    onItemClickCallback.onItemClicked(view, position);
}
public interface OnItemClickCallback {
    void onItemClicked(View view, int position);
}

}

Код ошибки

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.borisruzanov.popularmovies, PID: 11139
              java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
                  at java.util.ArrayList.get(ArrayList.java:411)
                  at com.borisruzanov.popularmovies.FavouritesFragment$1.onItemClicked(FavouritesFragment.java:106)
                  at com.borisruzanov.popularmovies.OnItemClickListener.onClick(OnItemClickListener.java:16)
                  at android.view.View.performClick(View.java:5610)
                  at android.view.View$PerformClick.run(View.java:22265)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6077)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

Большое спасибо за потраченное время и изучение вопроса. В случае, если вопрос был задан не корректно, просьба сообщить мне, чтобы дальнейшие вопросы я составлял более качественно.

Answer 1

Возможны два вариант:

  • Прогрузить данные из курсора в массив (например сразу после того как открыли базу) и потом уже в адаптере итерироваться по массиву
    • В момент клика "ходить" по курсору (mCursor.moveToPosition(position)) и читать данные из курсора.

Сейчас у вас как бы два источника

READ ALSO
В чём смысл создания массива на 0 элементов

В чём смысл создания массива на 0 элементов

С какой целью такая возможность поддерживается компилятором?

202
ViewPager android

ViewPager android

есть ViewPager с картинкамиМожно ли как то сделать так чтобы он как ViewFlipper (Слайдер) по указоному интервалу времени переходил на следующию картинку

159
RecyclerView вывод данных по условию

RecyclerView вывод данных по условию

Имею адаптер RecyclerView в который передаю ArrayList<MyList>ArrayList<MyList> myList;

202
Субтитры JavaFX

Субтитры JavaFX

Делаю проект по javaFXПодскажите, пожалуйста, как сделать привязку субтитров ко времени на видео?

192