java - 获取上下文以建立图标以进行滑动删除的最佳方法是什么
问题描述
我已经在一个片段中实现了一个 recyclerview。努力为回收站视图中的行实现 swipetodelete。当使用一些示例代码进行滑动时,它正在寻找为 ContextCompat.getDrawable() 方法建立上下文。设置上下文的最佳方法是什么?
在 Swipe To Delete 代码中设置图标的问题代码行是
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,最好不要从适配器获取上下文
推荐阅读
- jmeter - JMeter - 并行控制器和 HTTP 采样器的响应时间之间的差异
- c# - 有没有办法在不需要时忽略方法调用中的 out 参数?
- flutter - 如何使用颤振集成测试驱动程序捕获 html Web 元素
- r - 如何迭代 R 中的 1 <= i < j <= n 元素?
- php - 获取除星期日之外的两个日期之间的日期
- maven - 无法在詹金斯中读取 pom.xml
- html - 我的网站只在我的电脑分辨率上看起来不错
- command-line-interface - WSO2 API Manger ApiCtl 请求实体太大
- windows - 尝试使用没有代理设置的 Windows 10 在 npm 上安装 Cordova 时遇到网络错误
- ssis - SSIS 包从 Visual Studio 运行,但从 SQL Server 代理失败并出现错误 DTS_E_PRIMEOUTPUTFAILED