用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版权协议,转载请附上原文出处链接和本声明。