

如图所示:实际上在我们开发过程中经常会遇到这样的需求,在图1中点击小三角后跳转到图2,然后选中,图一
中就只显示你开启的页面吧,就是让tablayout中显示的是你选中的内容,而且可以切换位置,左滑删除
我的基本思路就是刚开始让图一中是存在着所有的内容,然后通过传值吧,图一的集合给图二,图二中将改变状态的集合在回传给图一,然后图一,修改成值选中的内容
代码:
1.现有一个实体类(维护状态)
public class ItemBean implements Serializable{
public String name;
public boolean isSelected;
public ItemBean(String name, boolean isSelected) {
this.name = name;
this.isSelected = isSelected;
}
@Override
public String toString() {
return "ItemBean{" +
"name='" + name + '\'' +
", isSelected=" + isSelected +
'}';
}
}
2.页面一中
public class XiTu_Fragment extends BaseFragment<XiTuPresenter,XiTuView> implements XiTuView {
@BindView(R.id.img)
ImageView img;
@BindView(R.id.tab)
TabLayout tab;
@BindView(R.id.vp)
ViewPager vp;
private String[] mTypes = new String[]{"iOS","工具资源","阅读","产品","Android",
"前段","设计","后端"};
private ArrayList<ItemBean> mItemBeans;
private ArrayList<Fragment> list;
private ArrayList<String> Title;
private String TAG="XiTu_Fragment";
@Override
protected XiTuPresenter initPresenter() {
return new XiTuPresenter();
}
@Override
protected int getLayoutID() {
return R.layout.fragment_xi_tu_;
}
@Override
protected void initView(View view) {
super.initView(view);
initFragments();
setVp();
}
private void setVp() {
AdapterVp adapterVp = new AdapterVp(getChildFragmentManager(), Title, list);
vp.setAdapter(adapterVp);
tab.setupWithViewPager(vp);
}
@Override
protected void initData() {
super.initData();
}
private void initFragments() {
mItemBeans = new ArrayList<>();
list = new ArrayList<>();
Title= new ArrayList<>();
for (int i = 0; i < mTypes.length; i++) {
ItemBean itemBean = new ItemBean(mTypes[i], true);//完善实体类,显示所有的内容,状态全都是true
mItemBeans.add(itemBean);
}
addFragments(mItemBeans);
//img就是三角形,通过他的点击事件,把原来的集合传给图2
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getContext(), XiTuActivity.class);
if(drta==null){
drta = mItemBeans;
}
intent.putExtra("data",drta);
startActivityForResult(intent,1);
}
});
}
// ItemBean是维护状态和标题的类
private void addFragments(ArrayList<ItemBean> data) {
list.clear(); //将原来(添加fragment的集合)都清空 ViewPager加载
Title.clear(); //原来的tablayout的集合
for (int i = 0; i < data.size(); i++) {
ItemBean itemBean1 = data.get(i);
if(itemBean1.isSelected){ // 未经选择的
this.list.add(Fragment_xi.newInstance(itemBean1.name));//实现对fragment的复用
Title.add(itemBean1.name);//最新的标题
}
}
}
//通过回传重现修改tablayout的内容个ViewPager
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==1&&resultCode==2){
ArrayList<ItemBean> data1 = (ArrayList<ItemBean>) data.getSerializableExtra("data");
addFragments(data1);//修改内容的方法
setVp(); //掉用适配器的方法
Log.e(TAG, "onActivityResult: "+data1);
}
super.onActivityResult(requestCode, resultCode, data);
}
}
2.在二个页面里
public class XiTuActivity extends AppCompatActivity {
private static final String TAG = "shu";
private RecyclerView mRe;
private ArrayList<ItemBean> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xi_tu);
initView();
}
private void initView() {
Intent intent = getIntent();
mData = (ArrayList<ItemBean>) intent.getSerializableExtra("data");//将在页面一中传来的集合
mRe = (RecyclerView) findViewById(R.id.re);
RlvGoldShowAdapter adapter = new RlvGoldShowAdapter(this, mData);//绑定适配器
mRe.setAdapter(adapter);
mRe.setLayoutManager(new LinearLayoutManager(this));
mRe.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
SimpleItemTouchHelper helper = new SimpleItemTouchHelper(adapter);//
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(helper);
itemTouchHelper.attachToRecyclerView(mRe);
adapter.setmListener(new RlvGoldShowAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View v, int position) {
ToastUtil.showShort("xixi");
}
});
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data",mData);
setResult(2,intent);
super.onBackPressed();
}
}
3.定义接口
public interface TouchCallBack {
//数据交换
void onItemMove(int fromPosition, int toPosition);
//数据删除
void onItemDelete(int position);
}
4.适配器(也得实现3的接口)
public class RlvGoldShowAdapter extends RecyclerView.Adapter<RlvGoldShowAdapter.MayDay> implements TouchCallBack{
private final Context context;
private final ArrayList<ItemBean> mData;
public RlvGoldShowAdapter(Context context, ArrayList<ItemBean> mData) {
this.context = context;
this.mData = mData;
}
@NonNull
@Override
public MayDay onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(context).inflate(R.layout.zhanshi, null);
return new MayDay(inflate);
}
@Override
public void onBindViewHolder(@NonNull MayDay holder, final int position) {
MayDay mayDay=(MayDay)holder;
final ItemBean bean = mData.get(position);
mayDay.name.setText(bean.name);
mayDay.sc.setChecked(bean.isSelected);
mayDay.sc.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
bean.isSelected = isChecked;
}
});
mayDay.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.OnItemClick(v,position);
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
@Override
public void onItemMove(int fromPosition, int toPosition) {
//数据交换
//交换集合的数据位置
Collections.swap(mData,fromPosition,toPosition);
//刷新适配器(局部刷新,移动)
notifyItemMoved(fromPosition,toPosition);
}
@Override
public void onItemDelete(int position) {
//数据删除
mData.remove(position);
//局部刷新(删除)
notifyItemRemoved(position);
}
public class MayDay extends RecyclerView.ViewHolder {
private TextView name;
private SwitchCompat sc;
public MayDay(View itemView) {
super(itemView);
name=itemView.findViewById(R.id.name);
sc=itemView.findViewById(R.id.sc);
}
}
public OnItemClickListener mListener;
public void setmListener(OnItemClickListener mListener) {
this.mListener = mListener;
}
public interface OnItemClickListener{
void OnItemClick(View v, int position);
}
}
5.适配器里引用的xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="140dp">
<TextView
android:id="@+id/name"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="asdasd"
android:drawableLeft="@mipmap/ic_drag"
android:drawablePadding="10dp"
android:layout_centerVertical="true"
/>
<android.support.v7.widget.SwitchCompat
android:id="@+id/sc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
android:layout_centerVertical="true"
/>
</RelativeLayout>
整体思路 : 是通过一个接口 ,在SimpleItemTouchHelper和适配器里实现,而SimpleItemTouchHelper中能够获取到我(上下拖动item,或者左右滑动时)的位置 然后在适配器里,获取到位置进行处理
有实现类
/**
* Created by asus on 2019/3/20.
*/
public class SimpleItemTouchHelper extends ItemTouchHelper.Callback {
private TouchCallBack mCallBack;
public SimpleItemTouchHelper(TouchCallBack callBack) {
mCallBack = callBack;
}
/**
* 返回可以滑动的方向,一般使用makeMovementFlags(int,int)或makeFlag(int, int)
* 来构造我们的返回值
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//允许上下拖拽
int drag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//允许向左滑动
int swipe = ItemTouchHelper.LEFT;
return makeMovementFlags(drag,swipe);
}
/**
* 上下拖动item时回调,可以调用Adapter的notifyItemMoved方法来交换两个ViewHolder的位置,
* 最后返回true,表示被拖动的ViewHolder已经移动到了目的位置,
* @param recyclerView
* @param viewHolder
* @param target
* @return
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
mCallBack.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
/**
* 当用户左右滑动item时达到删除条件就会调用,
* 一般为一半,条目继续滑动删除,否则弹回
* @param viewHolder
* @param direction
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mCallBack.onItemDelete(viewHolder.getAdapterPosition()); //删除条目,并局部刷新
}
/**
* 支持长按拖动,默认true
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return super.isLongPressDragEnabled();
}
/**
* 支持滑动,默认true
* @return
*/
@Override
public boolean isItemViewSwipeEnabled() {
return super.isItemViewSwipeEnabled();
}
}
网友评论