1. 程式人生 > >android地區三級聯動選擇

android地區三級聯動選擇

地區三級聯動選擇
一個Activity 2個Fragment, 在Activity中一次新增Fragment顯示省級、市級、縣級的列表。
Activity 根佈局為FrameLayout,其中顯示一個省級的RecyclerView的列表,在第一個省級列表RecyclerView的adapter中的點選加入市級的第一個Fragment
在市級的第一個Fragment的RecylerView的adapter中點選加入縣級第二個Fragment,縣級第二個Fragment的RecyclerView顯示縣級資料,選擇結果記錄,AreaBean物件從第一個activity的省級adapter傳到第一個fragment在到adapter市級,
再入第二個Fraggment的adapter 點選儲存返回資料,然後結束當前的Fragment和Activity。
第一個省級activity:
public class SelectProvince extends AppCompatActivity {
    @BindView(R.id.province_list)
    RecyclerView province_select;
    private RecyclerView.LayoutManager manager;
    private Province_adapter adapter;
    private CityBean cityBean;

    //用handler獲取子執行緒的資料
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            cityBean = (CityBean) msg.obj;
            //獲得資料
            adapter = new Province_adapter(SelectProvince.this,cityBean.getData());
            adapter.setAreaBean(new AreaBean());
            province_select.setAdapter(adapter);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_area);
        ButterKnife.bind(this);
        manager = new LinearLayoutManager(this);
        province_select.setLayoutManager(manager);
        province_select.setHasFixedSize(true);
        GetJsonToObject();
    }


    /*
     *解析JSon
     */
    private void GetJsonToObject(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("sadafas");
                Gson gson = new Gson();
                //傳出資料
                Message message = Message.obtain();
                message.obj = gson.fromJson(getJson("ChinaCites.json"),CityBean.class);
                handler.sendMessage(message);

            }
        }).start();
    }
    /*
     *獲得Json
     */
    public String getJson(String fileName) {

        StringBuilder stringBuilder = new StringBuilder();
        try {
            AssetManager assetManager = this.getAssets();
            BufferedReader bf = new BufferedReader(new InputStreamReader(
                    assetManager.open(fileName)));
            String line;
            while ((line = bf.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
    
 /*
     *返回和銷燬fragment
     */
    private void BackFragment(){
        if (getSupportFragmentManager().getBackStackEntryCount() == 0){
            //必須先setResult
            setResult(0x123,null);
            finish();
        }else {
            getSupportFragmentManager().popBackStack();
        }
    }

}
佈局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_select_area"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SelectProvince">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/province_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</FrameLayout>

市級Fragment:
public class SelectCity extends Fragment {
    @BindView(R.id.city_list)
    RecyclerView city_select;
    private RecyclerView.LayoutManager manager;
    private City_adapter adapter;
    List<CityBean.Data.City> list;
    private AppCompatActivity compatActivity;
    private AreaBean areaBean;

    public void setAreaBean(AreaBean areaBean) {
        this.areaBean = areaBean;
    }

    public AreaBean getAreaBean() {
        return areaBean;
    }

    public SelectCity(AppCompatActivity activity, List<CityBean.Data.City> list) {
             this.list = list;
        this.compatActivity = activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.fragment_select_city, container, false);
        ButterKnife.bind(this,rootview);
        manager = new LinearLayoutManager(rootview.getContext());
        city_select.setLayoutManager(manager);
        city_select.setHasFixedSize(true);
        adapter = new City_adapter(compatActivity,list);
        //傳遞選擇的省份
        adapter.setAreaBean(getAreaBean());
        city_select.setAdapter(adapter);
        return rootview;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //System.out.println("city");
    }
}

佈局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/SystemWhite">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/city_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

</FrameLayout>


縣級Fragment:

public class SelectCounty extends Fragment {
    @BindView(R.id.county_list)
    RecyclerView county_select;
    private RecyclerView.LayoutManager manager;
    private County_adapter adapter;
    private List<String> county;
    private AreaBean areaBean;

    public void setAreaBean(AreaBean areaBean) {
        this.areaBean = areaBean;
    }

    public AreaBean getAreaBean() {
        return areaBean;
    }

    private AppCompatActivity compatActivity;
    public SelectCounty(AppCompatActivity activity,List<String> county) {
        this.county = county;
        this.compatActivity = activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.fragment_select_county, container, false);
        ButterKnife.bind(this,rootview);
        manager = new LinearLayoutManager(rootview.getContext());
        county_select.setLayoutManager(manager);
        county_select.setHasFixedSize(true);
        adapter = new County_adapter(compatActivity,county);
        adapter.setAreaBean(getAreaBean());
        county_select.setAdapter(adapter);
        return rootview;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //System.out.println("conuty");
    }
}

佈局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/SystemWhite">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/county_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

</FrameLayout>
省級adapter:
public class Province_adapter extends RecyclerView.Adapter<Province_adapter.MyHolder> {
    private List<CityBean.Data> list;
    private AppCompatActivity compatActivity;
    private AreaBean areaBean;

    public void setAreaBean(AreaBean areaBean) {
        this.areaBean = areaBean;
    }

    public AreaBean getAreaBean() {
        return areaBean;
    }

    public Province_adapter(AppCompatActivity compatActivity, List<CityBean.Data> list){
        this.list = list;
        this.compatActivity = compatActivity;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootview = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_area,null);
        MyHolder holder = new MyHolder(rootview);

        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, final int position) {
        holder.area_text.setText(list.get(position).getName());
        holder.area_text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //跳到城市
                getAreaBean().setmProvince(list.get(position).getName());
                addFrament(compatActivity,list.get(position).getCity());

            }
        });
    }

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

    public static class MyHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.area_text)
        TextView area_text;
        public MyHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }

    private void addFrament(AppCompatActivity activity, List<CityBean.Data.City> list){
        SelectCity selectCity = new SelectCity(activity,list);
        //傳遞結果
        selectCity.setAreaBean(getAreaBean());

        FragmentManager manager = activity.getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.activity_select_area, selectCity,list.toString());
        transaction.addToBackStack(list.toString());
        transaction.commit();
    }


}
市級adapter:
public class City_adapter extends RecyclerView.Adapter<City_adapter.MyHolder> {
    private List<CityBean.Data.City> list;
    private AppCompatActivity compatActivity;
    private AreaBean areaBean;

    public void setAreaBean(AreaBean areaBean) {
        this.areaBean = areaBean;
    }

    public AreaBean getAreaBean() {
        return areaBean;
    }

    public City_adapter(AppCompatActivity compatActivity, List<CityBean.Data.City> list){
               this.list = list;
        this.compatActivity = compatActivity;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootview = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_area,null);
        MyHolder holder = new MyHolder(rootview);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, final int position) {
        holder.area_text.setText(list.get(position).getName());
        holder.area_text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //跳到縣區
                getAreaBean().setmCity(list.get(position).getName());
                addFrament(compatActivity,list.get(position).getCounty());
            }
        });
    }

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

    public static class MyHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.area_text)
        TextView area_text;
        public MyHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }
    private void addFrament(AppCompatActivity activity, List<String> county){
        SelectCounty selectCounty = new SelectCounty(activity,county);
        //傳遞城市
        selectCounty.setAreaBean(getAreaBean());
        FragmentManager manager = activity.getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.activity_select_area, selectCounty,list.toString());
        transaction.addToBackStack(list.toString());
        transaction.commit();
    }
}

縣級dapter:
public class County_adapter extends RecyclerView.Adapter<County_adapter.MyHolder> {
    private List<String> county;
    private AppCompatActivity compatActivity;
    private AreaBean areaBean;

    public void setAreaBean(AreaBean areaBean) {
        this.areaBean = areaBean;
    }

    public AreaBean getAreaBean() {
        return areaBean;
    }

    public County_adapter(AppCompatActivity compatActivity,List<String> county){
               this.county = county;
        this.compatActivity = compatActivity;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View rootview = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_area,null);
        MyHolder holder = new MyHolder(rootview);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, final int position) {
        holder.area_text.setText(county.get(position));
        holder.area_text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //獲取選擇地區的結果
                //compatActivity.setResult();
                getAreaBean().setmCounty(county.get(position));
                //返回結果
                Intent intent = new Intent();
                intent.putExtra("arearesult",getAreaBean());
                compatActivity.setResult(0x123,intent);
                //關閉當前activity
                compatActivity.finish();
            }
        });
    }

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

    public static class MyHolder extends RecyclerView.ViewHolder{
        @BindView(R.id.area_text)
        TextView area_text;
        public MyHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }
    }
}

Areabean:
public class AreaBean implements Serializable{
    private String mProvince;
    private String mCity;
    private String mCounty;

    public String getmProvince() {
        return mProvince;
    }

    public void setmProvince(String mProvince) {
        this.mProvince = mProvince;
    }

    public String getmCity() {
        return mCity;
    }

    public void setmCity(String mCity) {
        this.mCity = mCity;
    }

    public String getmCounty() {
        return mCounty;
    }

    public void setmCounty(String mCounty) {
        this.mCounty = mCounty;
    }
}


Citybean:

public class CityBean {
    private String note;
    private List<Data> data;

    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    public List<Data> getData() {
        return data;
    }
    public void setData(List<Data> data) {
        this.data = data;
    }
        public static class Data {
            private String name;
            private List<City> city;

            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public List<City> getCity() {
                return city;
            }
            public void setCity(List<City> city) {
                this.city = city;
            }
                public static class City {
                    private String name;
                    private List<String> county;
                    public String getName() {
                        return name;
                    }
                    public void setName(String name) {
                        this.name = name;
                    }
                    public List<String> getCounty() {
                        return county;
                    }
                    public void setCounty(List<String> county) {
                        this.county = county;
                    }
                }
        }
}