java - 获取上下文来建立用于滑动删除的图标的最佳方法是什么

标签 java android android-recyclerview

我在 fragment 中实现了回收器 View 。致力于为回收器 View 中的行实现滑动删除。当使用一些示例代码进行滑动时,它会为 ContextCompat.getDrawable() 方法建立上下文。设置上下文的最佳方法是什么?

在“滑动删除”代码中设置图标的问题代码行是

icon = ContextCompat.getDrawable(mAdapter.getContext(),R.drawable.baseline_delete_sweep_white_24dp)); 

这是 recyclerview 的 CheckInListAdapter 代码。

package com.example.checkingin;


import android.content.Context;
import android.util.Log;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.snackbar.Snackbar;

import java.util.List;

import static androidx.constraintlayout.widget.Constraints.TAG;

public class CheckInListAdapter extends RecyclerView.Adapter<CheckInListAdapter.ViewHolder>{
    private int checkInListLayout;
    private List<CheckInTable> checkInList;
    private CoordinatorLayout coordinatorLayout;
    private CheckInTable mRecentlyDeletedItem;
    private int mRecentlyDeletedItemPosition;

    public CheckInListAdapter(int layoutId) {
        Log.i(TAG, "CheckInListAdapter: ");
        checkInListLayout = layoutId;
    }

    public void setCheckInList(List<CheckInTable> allCheckIn) {
        checkInList = allCheckIn;
        Log.i(TAG, "setCheckInList: ");
        notifyDataSetChanged();
    }
    //public Context getContext() {return this.getContext();}

    @Override
    public int getItemCount() {
        return checkInList == null ? 0 : checkInList.size();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.i(TAG, "onCreateViewHolder: ");
        View view = LayoutInflater.from(
                parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
        ViewHolder checkInListViewHolder = new ViewHolder(view);
        return checkInListViewHolder;

    }
    public void deleteItem(int position) {
        mRecentlyDeletedItem = checkInList.get(position);
        mRecentlyDeletedItemPosition = position;

        checkInList.remove(position);
        notifyItemRemoved(position);
        showUndoSnackbar();
    }
    //private getContext(Context context) {
    //    context = this.getContext();
    //    return context;
   // }
    private void showUndoSnackbar() {
        //View view = mActivity.findViewById(R.id.check_in_recent_recycler_view);
        Snackbar snackbar = Snackbar
                .make(coordinatorLayout, "Item was removed from the list.", Snackbar.LENGTH_LONG);
        //Snackbar snackbar = Snackbar.make(view, R.string.checkin_recent_swipetodelete,
        //        Snackbar.LENGTH_LONG);
        snackbar.setAction(R.string.snack_bar_undo, v -> undoDelete());
        snackbar.show();
    }

    private void undoDelete() {
        checkInList.add(mRecentlyDeletedItemPosition,
                mRecentlyDeletedItem);
        notifyItemInserted(mRecentlyDeletedItemPosition);
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int listPosition) {

        TextView checkInLastDateTime = holder.checkInLastDateTime;
        TextView checkInTitle = holder.checkInTitle;
        TextView checkInDestinationName = holder.checkInDestinationName;
        TextView checkInComments = holder.checkInComments;
        holder.checkInEditButton.setImageResource(R.drawable.ic_menu_edit);
        holder.checkInResendButton.setImageResource(R.drawable.ic_menu_share);


        Log.i(TAG, "onBindViewHolder: ");

        checkInLastDateTime.setText(checkInList.get(listPosition).getCheckInLastDateTime());
        checkInTitle.setText(checkInList.get(listPosition).getCheckInTitle());
        checkInDestinationName.setText(checkInList.get(listPosition).getCheckInDestinationName());
        checkInComments.setText(checkInList.get(listPosition).getCheckInComments());

        ImageView checkInEditButton = holder.checkInEditButton;
        ImageView checkInResendButton = holder.checkInResendButton;

        ImageButton editCheckInButton = checkInEditButton.findViewById(R.id.checkInEditButton);
        ImageButton resendCheckInButton = checkInResendButton.findViewById(R.id.checkInResendButton);

        editCheckInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //put in edit check in logic
                Log.i(TAG, "onClick: for edit check in");
                //put in logic to switch to activity for add/edit checkin

            }
        }
        );
        resendCheckInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //put in resend logic
                Log.i(TAG, "onClick:  for resend");
                //add logic to store new check in table row and verify refresh of check in rows
                // on check in recent list


            }
        });

        }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView checkInLastDateTime;
        TextView checkInTitle;
        TextView checkInDestinationName;
        TextView checkInComments;
        ImageView checkInEditButton;
        ImageView checkInResendButton;
        ViewHolder(View itemView) {
            super(itemView);
            Log.i(TAG, "ViewHolder: ");
            checkInLastDateTime = itemView.findViewById(R.id.checkInLastDateTime);
            checkInTitle = itemView.findViewById(R.id.checkInTitle);
            checkInDestinationName = itemView.findViewById(R.id.checkInDestinationName);
            checkInComments = itemView.findViewById(R.id.checkInComments);
            checkInEditButton = itemView.findViewById(R.id.checkInEditButton);
            checkInResendButton = itemView.findViewById(R.id.checkInResendButton);
            //recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });
        }
    }
}

这是滑动删除代码

package com.example.checkingin;



import android.graphics.Canvas;
import android.graphics.Color;

import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;


import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;


public class CheckInRequestSwipeToDelete extends ItemTouchHelper.SimpleCallback {
    private CheckInListAdapter mAdapter;
    private Drawable icon;
    private final ColorDrawable background;




    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        int position = viewHolder.getAdapterPosition();
        mAdapter.deleteItem(position);
    }
    public CheckInRequestSwipeToDelete(CheckInListAdapter adapter) {
        super(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
        mAdapter = adapter;
        icon = ContextCompat.getDrawable(mAdapter.getContext(),R.drawable.baseline_delete_sweep_white_24dp));
        background = new ColorDrawable(Color.RED);
    }
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        // used for up and down movements
        return false;
    }



    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX,
                dY, actionState, isCurrentlyActive);
        View itemView = viewHolder.itemView;
        int backgroundCornerOffset = 20;
        if (dX > 0) { // Swiping to the right
            background.setBounds(itemView.getLeft(), itemView.getTop(),
                    itemView.getLeft() + ((int) dX) + backgroundCornerOffset,
                    itemView.getBottom());

        } else if (dX < 0) { // Swiping to the left
            background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,
                    itemView.getTop(), itemView.getRight(), itemView.getBottom());
        } else { // view is unSwiped
            icon.setBounds(0, 0, 0, 0);
            background.setBounds(0, 0, 0, 0);
        }
        background.draw(c);
        int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
        int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2;
        int iconBottom = iconTop + icon.getIntrinsicHeight();

        if (dX > 0) { // Swiping to the right
            int iconLeft = itemView.getLeft() + iconMargin;
            int iconRight = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth();

            icon.setBounds(iconLeft, iconTop, iconRight, iconBottom);

            background.setBounds(itemView.getLeft(), itemView.getTop(),
                    itemView.getLeft() + ((int) dX) + backgroundCornerOffset,
                    itemView.getBottom());
        } else if (dX < 0) { // Swiping to the left
            int iconLeft = itemView.getRight() - iconMargin - icon.getIntrinsicWidth();
            int iconRight = itemView.getRight() - iconMargin;
            icon.setBounds(iconLeft, iconTop, iconRight, iconBottom);

            background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset,
                    itemView.getTop(), itemView.getRight(), itemView.getBottom());
        } else { // view is unSwiped
            background.setBounds(0, 0, 0, 0);
        }

        background.draw(c);
    }

}

最佳答案

您可以通过构造函数传递图标Drawable,这比从适配器获取上下文更好

关于java - 获取上下文来建立用于滑动删除的图标的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60306832/

相关文章:

android - 我可以使用一个注册的 C2DM 帐户用于多个应用程序吗?

android - 如何在 onSaveInstanceState 中保存

android - 快速 throw 期间的 RecyclerView ANR

android - 如何从recyclerview获取整数值的总和

java - 如何使用变量访问 getStringArray

java - 删除句子和段落之间的各种额外空格

java - 图像 url 将 null 值传递给另一个 Intent

java - 如何删除文件中的现有文本

Java Swing GridBagLayout - 添加没有空格的按钮

java - Android处理程序,不在ui线程中执行post()