Fragment+recyclerview实现简易跳转

用fragment+recyclerview实现简易的微信跳转
在这里插入图片描述

部分代码已放在码云
https://gitee.com/kadd/android/tree/master/recyclerview

1.网格的实现
tab_chat.xml

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerview_chat"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

item_grid.xml
这里因为是网格布局,所以使用GridLayout布局,为了达到上图的间隔效果可使用android:layout_margin=“xxdp”,也可以使用addItemDecoration()

<TextView
    android:id="@+id/grid_num"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_row="0"
    android:layout_column="0"
    android:text="TextView" />

<TextView
    android:id="@+id/grid_content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_row="1"
    android:layout_column="1"
    android:text="TextView" />

grid_adapter.java
这个可参考官方文档来编写:https://developer.android.google.cn/guide/topics/ui/layout/recyclerview#java

public class grid_adapter extends RecyclerView.Adapter<grid_adapter.GridViewHolder> {
    private List<String> mList=new ArrayList<>();
    public grid_adapter(List<String> list){
        mList=list;
        notifyDataSetChanged();
    }
    
    @NonNull
    @Override
    public grid_adapter.GridViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_grid,parent,false);
        return new grid_adapter.GridViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull grid_adapter.GridViewHolder holder, int position) {
        holder.gridnum.setText(position+1+"");
        holder.gridcontent.setText(mList.get(position));
    }

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

    public class GridViewHolder extends RecyclerView.ViewHolder{
        TextView gridnum,gridcontent;

        public GridViewHolder(@NonNull View itemView) {
            super(itemView);
            gridnum=itemView.findViewById(R.id.grid_num);
            gridcontent=itemView.findViewById(R.id.grid_content);
        }
    }
}

wechatFragment.java
这个也可以参考官方文档来编写,但唯一比较难的点是,view,在oncreatview的方法里view的定义一定要先于数据的初始化和对于recyclerview的绑定,也就是要先于initdata()和initview()

public class wechatFragment extends Fragment {
    private List<String> mList=new ArrayList<>();
    private View view;
    private grid_adapter adapter;
    private RecyclerView recyclerView;

    public wechatFragment() {
        // Required empty public constructor
    }
    private void initData() {
        mList.add("李白");
        mList.add("苏轼");
        mList.add("杜甫");
        mList.add("辛弃疾");
        mList.add("屈原");
        mList.add("陆游");
        mList.add("王维");
        mList.add("白居易");
        mList.add("柳永");
        mList.add("陶渊明");
        mList.add("李清照");
        mList.add("曹植");
        mList.add("杜牧");
        mList.add("王昌龄");
        mList.add("李商隐");
        mList.add("岑参");
        mList.add("王安石");
        mList.add("杨万里");
        mList.add("刘禹锡");
        mList.add("高适");
        mList.add("黄庭坚");
        mList.add("龚自珍");
        mList.add("韦应物");
        mList.add("谢灵运");
        mList.add("斯莱特林");
        mList.add("格兰芬多");
        mList.add("赫奇帕奇");
        mList.add("拉文克劳");
        mList.add("毕加索唯一传人");
        mList.add("智商超过250");
    }
    private void initgridview(){
        adapter=new grid_adapter(mList);
        recyclerView=view.findViewById(R.id.recyclerview_chat);
        GridLayoutManager manager=new GridLayoutManager(getContext(),2);
        recyclerView.setLayoutManager(manager);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(adapter);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view=inflater.inflate(R.layout.tab_chat, container, false);
        initData();
        initgridview();
        return view;
    }


}

2.滑动删除
xml文件和网格基本一致,就不放了
ItemTouchHelperListener.java

public interface ItemTouchHelperListener {
    void onItemDismiss(int position);
}

SwipeItemTouchHelper.java

public class SwipeItemTouchHelper extends ItemTouchHelper.Callback {
    private swipe_adapter madapter;
    public SwipeItemTouchHelper(swipe_adapter adapter){
        madapter=adapter;
    }
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        int dragFlags = 0;  // 禁止上下拖动
        int swipeFlags = ItemTouchHelper.LEFT;  // 只允许从右向左滑动
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        madapter.onItemDismiss(viewHolder.getAdapterPosition());
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return false;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return false;
    }

    @Override
    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            viewHolder.itemView.setBackgroundResource(R.color.colorAccent);
        }
        super.onSelectedChanged(viewHolder, actionState);
    }

    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        float x = Math.abs(dX) + 0.5f;
        float width = viewHolder.itemView.getWidth();
        float alpha = 1f - x / width;
        viewHolder.itemView.setAlpha(alpha);
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    @Override
    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        viewHolder.itemView.setBackgroundResource(R.color.colorPrimary);
        viewHolder.itemView.setAlpha(1.0f);
        super.clearView(recyclerView, viewHolder);
    }
}

swipe_adapter.java

public class swipe_adapter extends RecyclerView.Adapter<swipe_adapter.swipeViewHolder> implements ItemTouchHelperListener {
    private List<String> mList = new ArrayList<>();

    public swipe_adapter(List<String> mList) {
        this.mList = mList;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public swipe_adapter.swipeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_swipe, parent, false);
        return new swipeViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull swipe_adapter.swipeViewHolder holder, int position) {
         holder.swipe_content.setText(mList.get(position));
    }

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

    @Override
    public void onItemDismiss(int position) {
        if (position < 0 || position > getItemCount()) {
            return;
        }

        mList.remove(position);
        notifyItemRemoved(position);

        // 解决 RecyclerView 删除 Item 导致位置错乱的问题
        if (position != mList.size()) {
            notifyItemRangeChanged(position, mList.size() - position);
        }
    }


    public class swipeViewHolder extends RecyclerView.ViewHolder{
        TextView swipe_content;
        public swipeViewHolder(@NonNull View itemView) {
            super(itemView);
            swipe_content=itemView.findViewById(R.id.swipe_content);
        }
    }
}

friendFragment.java

public class friendFragment extends Fragment {
    private View view;
    private List<String> mList = new ArrayList<>();
    private swipe_adapter adapter;
    private RecyclerView recyclerView;

    public friendFragment() {
        // Required empty public constructor
    }
    private void initData() {
        mList.add("李白");
        mList.add("苏轼");
        mList.add("杜甫");
        mList.add("辛弃疾");
        mList.add("屈原");
        mList.add("陆游");
        mList.add("王维");
        mList.add("白居易");
        mList.add("柳永");
        mList.add("陶渊明");
        mList.add("李清照");
        mList.add("曹植");
        mList.add("杜牧");
        mList.add("王昌龄");
        mList.add("李商隐");
        mList.add("岑参");
        mList.add("王安石");
        mList.add("杨万里");
        mList.add("刘禹锡");
        mList.add("高适");
        mList.add("黄庭坚");
        mList.add("龚自珍");
        mList.add("韦应物");
        mList.add("谢灵运");
        mList.add("斯莱特林");
        mList.add("格兰芬多");
        mList.add("赫奇帕奇");
        mList.add("拉文克劳");
        mList.add("毕加索唯一传人");
        mList.add("智商超过250");
    }
    private void initView() {
        adapter = new swipe_adapter(mList);

        recyclerView = view.findViewById(R.id.recyclerview_swipe);
        ItemTouchHelper.Callback callback=new SwipeItemTouchHelper(adapter);
        ItemTouchHelper touchHelper=new ItemTouchHelper(callback);
        touchHelper.attachToRecyclerView(recyclerView);

        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(adapter);

    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view=inflater.inflate(R.layout.tab_friend, container, false);
        initData();
        initView();
        return view;
    }

}

代码新人
如有问题,请多指教


版权声明:本文为qq_41372803原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。