短视频app制作,实现消息列表的左滑删除或长按删除
首先布局就是一个RecyclerView
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
适配器什么的不多说,正常写就行
mRecyclerView = findViewById(R.id.recyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
myApr = new MyApr();
mRecyclerView.setAdapter(myApr);
mDatas = new ArrayList<>();//这里是数据 自己放我这里就不放了
//添加长按删除监听
myApr.setOnremoveListnner(new MyApr.OnremoveListnner() {
@Override
public void ondelect(final int i) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("确定删除?");
builder.setTitle("提示");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mDatas.remove(i);
//更新列表
myApr.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
}
});
//添加AlertDialog.Builder对象的setNegativeButton()方法
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.create().show();
}
});
public static class MyApr extends RecyclerView.Adapter<VH> {
//创建删除监听接口
interface OnremoveListnner {
void ondelect(int i);
}
private OnremoveListnner onremoveListnner;
public void setOnremoveListnner(OnremoveListnner onremoveListnner) {
this.onremoveListnner = onremoveListnner;
}
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false));
}
@Override
public void onBindViewHolder(final VH holder, final int position) {
//show=展示的view click=删除view 监听也和recyclerView的不一样
holder.show.setText(mDatas.get(position));
//恢复状态
holder.recyclerViewItem.apply();
holder.click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDatas.remove(position);
//更新列表
notifyDataSetChanged();
Toast.makeText(holder.itemView.getContext(), "删除成功", Toast.LENGTH_LONG).show();
}
});
//长按监听
holder.show.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (onremoveListnner != null) {
//删除
onremoveListnner.ondelect(position);
}
return true;
}
});
}
@Override
public int getItemCount() {
return null == mDatas ? 0 : mDatas.size();
}
}
左划删除我这里跟RecyclerView是没有关系的,布局最关键,跟item有关,父容器需要自定义HorizontalScrollView,自己创建一个类就行,属性可以自己修改
public class MyRecyclerViewItem extends HorizontalScrollView {
public MyRecyclerViewItem(Context context) {
super(context);
init(context,null);
}
public MyRecyclerViewItem(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MyRecyclerViewItem(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
public static final String TAG=MyRecyclerViewItem.class.getSimpleName();
private boolean isLeft = true;//默认左边
private int rightLayoutWidth;
private int leftLayoutWidth;
private int range;
public void setRightLayoutWidth(int rightLayoutWidth) {
this.rightLayoutWidth = rightLayoutWidth;
}
public void setLeftLayoutWidth(int leftLayoutWidth) {
this.leftLayoutWidth = leftLayoutWidth;
}
public void setRange(int range) {
this.range = range;
}
private void init(Context context, AttributeSet attrs) {
leftLayoutWidth = getScreenSize(getContext()).widthPixels;// recyclerview 宽度
rightLayoutWidth = dp2px(getContext(),200);// 右边布局的宽度
range = dp2px(getContext(), 30);// 移动多少开始切换阈值
if (attrs!=null){
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyRecyclerViewItem);
int indexCount = typedArray.getIndexCount();
for (int i = 0; i < indexCount; i++) {
int index = typedArray.getIndex(i);
if (index==R.styleable.MyRecyclerViewItem_left_width){
leftLayoutWidth = typedArray.getInteger(index, 0)==0? leftLayoutWidth : dp2px(context, typedArray.getInteger(index, 0));
}
if (index==R.styleable.MyRecyclerViewItem_right_width){
rightLayoutWidth = typedArray.getInteger(index, 0)==0? rightLayoutWidth : dp2px(context, typedArray.getInteger(index, 0));
}
if (index==R.styleable.MyRecyclerViewItem_move_range){
range = typedArray.getInteger(index, 0)==0? range : dp2px(context, typedArray.getInteger(index, 0));
}
}
typedArray.recycle();
}
}
//适配器 bind 方法中调用
public void apply() {
isLeft = true;
changeLayout();
scrollTo(0, 0);
}
private void changeLayout() {
try {
ViewGroup mainLayout= (ViewGroup) getChildAt(0);
ViewGroup left= (ViewGroup) mainLayout.getChildAt(0);
ViewGroup right= (ViewGroup) mainLayout.getChildAt(1);
if (left.getMeasuredWidth()== leftLayoutWidth && right.getMeasuredWidth()==rightLayoutWidth){
Log.i(TAG, "changeLayout: no change");
return;
}
ViewGroup.LayoutParams layoutParams = left.getLayoutParams();
layoutParams.width = leftLayoutWidth;
left.setLayoutParams(layoutParams);
ViewGroup.LayoutParams layoutParams2 = right.getLayoutParams();
layoutParams2.width = rightLayoutWidth;
left.setLayoutParams(layoutParams);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DisplayMetrics getScreenSize(Context context){
DisplayMetrics dm = new DisplayMetrics();
WindowManager windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
return dm;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
Log.i(getClass().getSimpleName(), "down");
return true;
}
if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
Log.i(getClass().getSimpleName(), "up");
if (isLeft) {
if (getScrollX() > range) {
isLeft = false;
smoothScrollTo(rightLayoutWidth, 0);
} else {
smoothScrollTo(0, 0);
}
} else {
if (getScrollX() < (rightLayoutWidth - range)) {
isLeft = true;
smoothScrollTo(0, 0);
} else {
smoothScrollTo(rightLayoutWidth, 0);
}
}
return true;
}
Log.i(getClass().getSimpleName(), "end");
return super.onTouchEvent(ev);
}
public static int dp2px(Context context,float dpValue) {
DisplayMetrics scale = context.getResources().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, scale);
}
}
以上就是 短视频app制作,实现消息列表的左滑删除或长按删除,更多内容欢迎关注之后的文章