两步实现RecycleView拖动,新闻类别定制

来源:互联网 发布:淘宝上的手机靠谱吗 编辑:程序博客网 时间:2024/05/24 08:34

1,activity,里面有一些项目的东西,用不到的直接删哈。

import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.helper.ItemTouchHelper;import android.util.Log;import android.view.View;import android.widget.TextView;import com.zongsi.mikeli.funday.R;import com.zongsi.mikeli.funday.adapter.TitleAdapter;import com.zongsi.mikeli.funday.database.TitleDatabase;import com.zongsi.mikeli.funday.util.ChangeList;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class TitleActivity extends AppCompatActivity implements View.OnClickListener {    private static final String TAG = "ttt";    private RecyclerView mRecycleView;    private TextView mTitleBack;    private TextView mTitleGo;    private TitleAdapter mAdapter;    private List<String> mList = new ArrayList<>();    private ChangeList<String> mSelect = new ChangeList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_title);        initView();        initListener();        initData();        initAdapter();        //1.为recycleview绑定拖拽事件        helper.attachToRecyclerView(mRecycleView);    }    private void initListener() {        mSelect.setChangerListener(new ChangeList.ChangerListener() {            @Override            public void onChanger() {                Log.i(TAG, "onChanger: list"+mSelect.size());                if(mSelect.size()==0){                    mTitleGo.setText("随便看看");                }else {                    mTitleGo.setText("开始聚焦");                }            }        });    }    private void initData() {            mList.add("推荐");            mList.add("游戏");            mList.add("小说");            mList.add("漫画");            mList.add("音乐");            mList.add("电影");            mList.add("视频");            mList.add("电竞");            mList.add("二次元");            mList.add("Cosplay");            mList.add("王者荣耀");            mList.add("体育");            mList.add("时尚");    }    private void initAdapter() {        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 12);        //这个确定每个item所占的空间,两个字就占3个位置,否者占4个。个人需求定义。如果都是一样,可不要该方法。        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {            @Override            public int getSpanSize(int position) {                if(mList.get(position).length() ==2){                   return 3;                }                return 4;            }        });        mRecycleView.setLayoutManager(gridLayoutManager);        mAdapter = new TitleAdapter(this,mList,mSelect);        mRecycleView.setAdapter(mAdapter);    }    private void initView() {        mRecycleView = (RecyclerView) findViewById(R.id.title_recycle_view);        mTitleBack = (TextView) findViewById(R.id.title_back);        mTitleGo = (TextView) findViewById(R.id.title_go);        mTitleBack.setOnClickListener(this);        mTitleGo.setOnClickListener(this);    }    @Override    public void onClick(View view) {        switch(view.getId()){            case R.id.title_back:                startActivity(new Intent(this,FirstActivity.class));                finish();            break;            case R.id.title_go:                getSharedPreferences("funDayFirst",MODE_PRIVATE).edit().putBoolean("second",true).apply();                mAdapter.notifyItemRangeChanged(0,mList.size());                Log.i(TAG, "onClick: "+mList.toString());                TitleDatabase titleDatabase = new TitleDatabase(this);                titleDatabase.addBySql(mList);                List<String> save = new ArrayList<>();                mSelect.add(0,mList.get(0));                for (int i = 0; i < mList.size(); i++) {                    if(mSelect.contains(mList.get(i))){                        save.add(mList.get(i));                    }                }                titleDatabase.addSelectBySql(save);                startActivity(new Intent(this,MainActivity.class));                finish();            break;        }    }    //2.为RecycleView绑定触摸事件,这个是拖拽的核心。    ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {        @Override        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {            //首先回调的方法 返回int表示是否监听该方向            int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//拖拽            int swipeFlags = 0;//侧滑删除            return makeMovementFlags(dragFlags,swipeFlags);        }        @Override        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {            //滑动事件            int start = viewHolder.getAdapterPosition();            int end = target.getAdapterPosition();            //判断,第一个不会进行拖拽。如果想全部都能动,去掉该判断即可            if(start!=0&&end!=0){                Collections.swap(mList,start,end);                mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());                Log.i(TAG, "onMove: "+start+" "+end);                //swip方法会让数据源list乱掉,这个是对数据排序                if(start < end){                    for (;start+1 < end; start++) {                        String temp = mList.get(start);                        mList.set(start,mList.get(start+1));                        mList.set(start+1,temp);                    }                } else {                    for (; start-1>end; start--) {                        String temp = mList.get(start);                        mList.set(start,mList.get(start-1));                        mList.set(start-1,temp);                    }                }            }            Log.i(TAG, "onMove: "+mList.toString());            return false;        }        @Override        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {        }        @Override        public boolean isLongPressDragEnabled() {            //是否可拖拽            return true;        }    });}
2.adapter和正常的一样不需要动。

import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import com.zongsi.mikeli.funday.R;import com.zongsi.mikeli.funday.database.TitleDatabase;import com.zongsi.mikeli.funday.util.ChangeList;import java.util.List;/** * Created by mike.li on 2017/4/18. * Email:mike.li@coolpad.com */public class TitleAdapter extends RecyclerView.Adapter<TitleAdapter.TitleViewHolder> {    private static final String TAG = "ttt";    private Context mContext;    private List<String> mList;    private ChangeList<String> mSelect;    public TitleAdapter(Context mContext, List<String> mList, ChangeList<String> mSelect) {        this.mContext = mContext;        this.mList = mList;        this.mSelect = mSelect;        mSelect.addAll(new TitleDatabase(mContext).getSelectAllData());    }    @Override    public TitleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        return new TitleViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_title, parent, false));    }    @Override    public void onBindViewHolder(final TitleViewHolder holder, final int position) {        holder.titleItemText.setText(mList.get(position));        if(position==0){            holder.titleItemText.setBackgroundColor(mContext.getColor(R.color.colorAccent));        }else {            if(mSelect.contains(mList.get(position))){                holder.titleItemText.setBackgroundColor(mContext.getColor(R.color.colorSelect));            }else {                holder.titleItemText.setBackgroundColor(mContext.getColor(R.color.colorUnselect));            }        }        holder.titleItemText.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(mSelect.contains(mList.get(position))){                    mSelect.remove(mList.get(position));                    holder.titleItemText.setBackgroundColor(mContext.getColor(R.color.colorUnselect));                }else {                    mSelect.add(mList.get(position));                    holder.titleItemText.setBackgroundColor(mContext.getColor(R.color.colorSelect));                }            }        });        holder.rootView.setTag(position);    }    @Override    public int getItemCount() {        return mList.size();    }    class TitleViewHolder extends RecyclerView.ViewHolder {        private View rootView;        private Button titleItemText;        private TitleViewHolder(View itemView) {            super(itemView);            this.rootView = itemView;            this.titleItemText = (Button) rootView.findViewById(R.id.title_item_text);        }    }}

3.说明一下,两个gridView之间实现的互动。

其实在上面我们已经实现了,我们只需要让比如中间那个item占的空间是一整行,并且让这个不能触摸,不能交换。这样就实现两块的隔离了。

这也是我看腾讯,阿里的布局受到的启发。大家可以试试,以后我用到再给大家贴代码。

0 0
原创粉丝点击