上下列表中的item相互添加、删除,并仿照新闻客户端无限添加Fragment

上一篇文章实现了上下列表中的item相互添加、删除,,在此基础上结合TabLayout实现并仿照新闻客户端无限添加Fragment

一、主activity里面:

package com.addremoveitemtest;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageButton;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.btn_more)
    ImageButton btnMore;
    @BindView(R.id.tabLayout)
    TabLayout tabLayout;
    @BindView(R.id.viewPager)
    ViewPager viewPager;
    private ArrayList<String> strList0=new ArrayList<>();
    private ItemFragment[] ItemFragments;
    private PageAdapter pageAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initFragment(strList0);
    }

    private void initFragment(ArrayList<String> strList0) {
        ItemFragments=new ItemFragment[strList0.size()];
        for (int i = 0; i < ItemFragments.length; i++) {
            ItemFragments[i]=ItemFragment.newInstance(strList0.get(i));
        }
        String[] title=new String[strList0.size()];
        for (int i = 0; i < title.length; i++) {
            title[i]=strList0.get(i);
        }
        FragmentManager supportFragmentManager = getSupportFragmentManager();

        pageAdapter = new PageAdapter(supportFragmentManager, this, title, ItemFragments);
        viewPager.setAdapter(pageAdapter);
        tabLayout.setupWithViewPager(viewPager);

    }

    @OnClick(R.id.btn_more)
    public void onViewClicked() {
        startActivityForResult(new Intent(this,AddRemove.class),100);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100&&resultCode==101) {
            ArrayList<String> strListCur = data.getStringArrayListExtra("strListCur");
            strList0.addAll(strListCur);
            initFragment(strList0);
            pageAdapter.notifyDataSetChanged();
        }
    }
}
二、进入选择页面:

package com.addremoveitemtest;

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.view.View;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class AddRemove extends AppCompatActivity {

    @BindView(R.id.recycler4)
    RecyclerView mRecycler4;
    @BindView(R.id.textContent)
    TextView mTextContent;
    private List<AddRemoveEntity> addListSum = new ArrayList<>();
    private List<AddRemoveEntity> addList1 = new ArrayList<>();
    private List<AddRemoveEntity> addList2;
    private AddRemoveAdapter mAddRemoveAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_remove);
        ButterKnife.bind(this);
        initData();
        init();
    }

    private void initData() {
        addList2 = AddRemoveEntity.entityList;//给集合2
        addList2.removeAll(addList1);//
        addListSum.add(null);//可以看作"选择item"标题
        addListSum.addAll(addList1);//可以看作上面的item集合
        addListSum.add(null);//可以看作"总的item"标题
        addListSum.addAll(addList2);//可以看作下面的item集合
    }

    private void init() {

        mAddRemoveAdapter = new AddRemoveAdapter(this, addList1, addListSum);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        mRecycler4.setLayoutManager(gridLayoutManager);
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                /*控制每行多少item*/
                switch (mAddRemoveAdapter.getItemViewType(position)) {
                    case AddRemoveAdapter.TYPE0:
                    case AddRemoveAdapter.TYPE1:
                        //返回为3,则ItemViewType为TYPE0和TYPE1时,鉴于上面设置的3,对应的View占3/3行,也就是"选择item"和"总的item"标题各占一行
                        return 3;
                }
                //返回为1,则ItemViewType,鉴于上面设置的3,对应的View占1/3行,也就是选择item占1/3行,也就是三个item占一行
                return 1;
            }
        });
        mRecycler4.setAdapter(mAddRemoveAdapter);
        mAddRemoveAdapter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*点击每个item*/
                switch (v.getId()) {
                    case R.id.btn_label:
                      /*在此处获得Adapter里面设置的标记并判断位置*/
                        int id = (int) v.getTag();
                        /*获取id在上面集合中的位置*/
                        int i = getIById(id, addList1);
                        /*如果这个id在上面集合中*/
                        if (i != -1) {
                            AddRemoveEntity addRemoveEntity = addList1.remove(i);//将点击的此item从上面集合删除
                            addList2.add(addRemoveEntity);//下面集合中
                            addListSum.remove(i + 1);//从总的集合中把此item删除
                            addListSum.add(addRemoveEntity);//插入到总集合的最后一个,注:在集合最后一个位置插入元素可不用指定位置
                            mAddRemoveAdapter.notifyItemMoved(i + 1, addListSum.size() - 1);//通知adapter此item从i + 1位置移动到addListSum.size() - 1位置
                            mAddRemoveAdapter.notifyItemChanged(addListSum.size() - 1);//刷新adapter位置变化
                        } else {
                            int i2 = getIById(id, addList2);//查询是否下面集合中有该item,并返回位置索引
                            if (i2 != -1) {//如果存在
                                AddRemoveEntity removeEntity = addList2.remove(i2);//将此item下面集合中移除
                                addList1.add(removeEntity);//加入上面集合中
                                addListSum.remove(1 + addList1.size() - 1 + 1 + i2);//从总的集合中移除
                                //并加入总的集合中,上面集合的最后一个位置(总的集合包括上面和下面集合),注:在总的集合中间插入元素一定要指定位置
                                addListSum.add(addList1.size(), removeEntity);
                                /*通知adapter此item从1 + addList1.size() - 1 + 1 + i2位置移动到 1 + addList1.size() - 1位置
                                其中第一个1代表总集合中的第一null,也就是"选择的item"标题,第三个1代表总集合中的第二null,也就是"总的item"标题*/
                                mAddRemoveAdapter.notifyItemMoved(1 + addList1.size() - 1 + 1 + i2, 1 + addList1.size() - 1);
                                mAddRemoveAdapter.notifyItemChanged(1 + addList1.size() - 1);//刷新adapter位置变化
                            }
                        }
                }
            }
        });
    }

    /**
     * 根据id获取点击按钮在集合中对应的位置i
     *
     * @param id
     * @param listCur
     * @return
     */
    public int getIById(int id, List<AddRemoveEntity> listCur) {
        for (int i = 0; i < listCur.size(); i++) {
            if (id == listCur.get(i).getId()) {
                return i;
            }
        }
        return -1;
    }
    /*就多了这一段主要代码*/
    public void btnOk(View view) {
        ArrayList<String>strListCur=new ArrayList<>();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < addList1.size(); i++) {
            stringBuffer.append(addList1.get(i).getName() + "\n");
            strListCur.add(addList1.get(i).getName());
        }
        mTextContent.setText(stringBuffer.toString());
        Intent intentRe=new Intent(this,MainActivity.class);
        intentRe.putStringArrayListExtra("strListCur",strListCur);
        this.setResult(101,intentRe);
        finish();
    }

}
三、item的adapter里面:代码不变

demo点击打开链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值