簡體   English   中英

當我嘗試將數據從sqlite傳遞到新活動時遇到錯誤,拋出recyclerview(Android)

[英]Getting an error when i try to pass data from sqlite to new activity throw recyclerview (Android)

我正在努力實現這樣的目標:

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

但是此方法getItemAtPosition我不能與RecyclerView一起使用。

這是我的MainActivity.java,其中有一個錯誤:

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

我需要提到的是,我在RecyclerViewAdapter上設置了兩個onItemClickListeners。 我在這個錯誤:

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

第二個onItemClickListener僅在選擇一個imageView時才調用。 PS:當我嘗試從數據庫中刪除項目時,我也遇到了一些問題,但是不知何故,它正在刪除前兩個,然后再剩下兩個時,就不會刪除它們。 這是第二個:

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

我得到的錯誤:

    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)

編輯:

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

}

當您等待CursorgetItemAtPosition返回一個View ,因此您將獲得ClassCastException. 使用適配器檢索所需的游標。

編輯:實際上,它在GridAdapter上崩潰。 它返回您的模型對象,但是您嘗試將其強制轉換為光標。 糾正此問題后,您應該碰到我所談論的第一個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM