recyclerview将item置顶的动画效果

162 阅读1分钟
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {

    private List<String> lists;
    private OnItemMoveClickListener mOnItemMoveClickListener;

    public void setLists(List<String> list) {
        lists = list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.tv_content.setText("aaa");
        holder.tv_num.setText(String.valueOf(position));
        holder.tv_content.setOnClickListener(view -> {
            if (mOnItemMoveClickListener != null) {
                mOnItemMoveClickListener.onMoveClick(position, 0);
            }
        });
    }

    @Override
    public int getItemCount() {
        return lists.size();
    }

    public void setOnItemMoveClickListener(
            OnItemMoveClickListener listener) {
        this.mOnItemMoveClickListener = listener;
    }

    public interface OnItemMoveClickListener {
        void onMoveClick(int fromPosition, int toPosition);
    }

    public List<String> getLists() {
        return lists;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv_content;
        private TextView tv_num;

        ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_content = itemView.findViewById(R.id.tv_item_content);
            tv_num = itemView.findViewById(R.id.tv_item_num);
        }
    }
}




public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.rv_content);

        List<String> list = new ArrayList<>();
        for (int i=0; i<10; i++) {
            list.add("aa");
        }

        TestAdapter testAdapter = new TestAdapter();
        testAdapter.setLists(list);
        testAdapter.setOnItemMoveClickListener((fromPosition, toPosition) -> {
            testAdapter.notifyItemMoved(fromPosition, toPosition);
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(testAdapter.getLists(), i, i - 1);
            }
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    //根据业务逻辑判断是否需要再从后台获取一遍数据进行全刷
                    //这个handler可以从外部传进来,然后在外部获取数据,刷新全部
                    //item move的动画默认效果是250ms,这里直接重新刷以便数据
                    testAdapter.setLists(list);
                    testAdapter.notifyDataSetChanged();
                }
            },250);
        });
        recyclerView.setAdapter(testAdapter);
    }
}