i'm trying to achieve something like this:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView listView, View view,
int position, long id) {
Cursor itemCursor = (Cursor) MainActivity.this.listView.getItemAtPosition(position);
int personID = itemCursor.getInt(itemCursor.getColumnIndex(ExampleDBHelper.PERSON_COLUMN_ID));
Intent intent = new Intent(getApplicationContext(), CreateOrEditActivity.class);
intent.putExtra(KEY_EXTRA_CONTACT_ID, personID);
startActivity(intent);
}
});
but this method getItemAtPosition i can't use with RecyclerView.
This is my MainActivity.java where is an error:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
public final static String KEY_EXTRA_BIRTHDAY_ID = "KEY_EXTRA_BIRTHDAY_ID";
RecyclerView mRecyclerView;
RecyclerView.LayoutManager mLayoutManager;
GridAdapter mGridAdapter;
DBHelper dbh;
String firstName;
Animation shakeAnimation;
ImageView deleteImage;
List<Birthday> birthdays;
int birthdayId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
initAddImage();
dbh = new DBHelper(this);
initRecyclerView();
initDeleteImage();
}
public List<Birthday> getData() {
birthdays = new ArrayList<>();
Birthday birthday = null;
Cursor c = dbh.getBirthdayData();
if (c != null) {
while (c.moveToNext()) {
int nameIndex = c.getColumnIndex(dbh.BIRTHDAY_NAME);
String nameText = c.getString(nameIndex);
this.firstName = nameText;
int lastNameIndex = c.getColumnIndex(dbh.BIRTHDAY_LAST_NAME);
String lastNameText = c.getString(lastNameIndex);
birthday = new Birthday();
birthday.setNAME(nameText);
birthday.setLAST_NAME(lastNameText);
birthdays.add(birthday);
}
}
return birthdays;
}
private void initRecyclerView(){
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setItemAnimator(new ScaleInAnimator());
// The number of Columns
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new GridLayoutManager(this, 3);
mRecyclerView.setLayoutManager(mLayoutManager);
mGridAdapter = new GridAdapter(getData());
mRecyclerView.setAdapter(mGridAdapter);
mGridAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "It works!", Toast.LENGTH_SHORT).show();
Cursor cursorItem = (Cursor) mGridAdapter.getItem(position);
birthdayId = cursorItem.getInt(cursorItem.getColumnIndex(DBHelper.BIRTHDAY_ID));
Intent intent = new Intent(MainActivity.this, EditBirthdayActivity.class);
intent.putExtra(KEY_EXTRA_BIRTHDAY_ID, birthdayId);
startActivity(intent);
}
});
}
private void initAddImage(){
ImageView addImage = (ImageView) findViewById(R.id.add_image);
addImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddBirthday.class);
startActivity(intent);
}
});
}
private void initDeleteImage(){
deleteImage = (ImageView) findViewById(R.id.delete_image);
shakeAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.shake_animation);
deleteImage.setOnClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
initRecyclerView();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.delete_image:
mRecyclerView.startAnimation(shakeAnimation);
if (v.equals(deleteImage)) {
mGridAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
dbh.deleteBirthday(position);
mGridAdapter.removeItem(position);
mRecyclerView.clearAnimation();
}
});
}
}
}
}
I need to mention that i have set two onItemClickListeners on my RecyclerViewAdapter. And i'm getting an error in this one:
mGridAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "It works!", Toast.LENGTH_SHORT).show();
Cursor cursorItem = (Cursor) mGridAdapter.getItem(position);
birthdayId = cursorItem.getInt(cursorItem.getColumnIndex(DBHelper.BIRTHDAY_ID));
Intent intent = new Intent(MainActivity.this, EditBirthdayActivity.class);
intent.putExtra(KEY_EXTRA_BIRTHDAY_ID, birthdayId);
startActivity(intent);
}
});
and second onItemClickListener i'm calling only when one imageView is selected. PS I'm also experiencing some problem there when i try to delete items from database, but somehow it is deleting first two and then when there is left two more it won't delete them. This is the second one:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.delete_image:
mRecyclerView.startAnimation(shakeAnimation);
if (v.equals(deleteImage)) {
mGridAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
dbh.deleteBirthday(position);
mGridAdapter.removeItem(position);
mRecyclerView.clearAnimation();
}
});
}
}
}
Error i'm getting:
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: FATAL EXCEPTION: main
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: Process: com.dusandimitrijevic.dontforget, PID: 26181
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: java.lang.ClassCastException: model.Birthday cannot be cast to android.database.Cursor
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at com.dusandimitrijevic.dontforget.MainActivity$1.onItemClick(MainActivity.java:94)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at adapter.GridAdapter$MyViewHolder.onClick(GridAdapter.java:43)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at android.view.View.performClick(View.java:5197)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:20926)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at android.os.Looper.loop(Looper.java:145)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5951)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
11-08 00:52:43.179 26181-26181/com.dusandimitrijevic.dontforget E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
EDIT:
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.MyViewHolder> {
private List<Birthday> birthdays;
OnItemClickListener mItemClickListener;
public GridAdapter(List<Birthday> birthdays){
this.birthdays = birthdays;
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CustomTextView firstName, lastName;
TextView dateOfBirthday;
public MyViewHolder(View itemView) {
super(itemView);
firstName = (CustomTextView) itemView.findViewById(R.id.first_name);
lastName = (CustomTextView) itemView.findViewById(R.id.last_name);
dateOfBirthday = (TextView) itemView.findViewById(R.id.date_of_birthday);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mItemClickListener.onItemClick(v, getAdapterPosition());
}
}
public void removeItem(int position) {
birthdays.remove(position);
notifyItemRemoved(position);
}
public Object getItem(int position)
{
return birthdays.get(position);
}
@Override
public long getItemId(int position)
{
return birthdays.indexOf(getItem(position));
}
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false);
MyViewHolder holder = new MyViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.firstName.setText(birthdays.get(position).getNAME());
holder.lastName.setText(birthdays.get(position).getLAST_NAME());
}
@Override
public int getItemCount() {
return birthdays.size();
}
}
getItemAtPosition
returns a View
, when you are waiting for a Cursor
, so you get a ClassCastException.
Use the adapter to retrieve the cursor you want.
Edit : actually it's crashing on the GridAdapter. It returns your model object but you try to cast it as a cursor. After correcting this one you should run into the first one I've talked about
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.