android多級聯動
❶ 怎樣使用pickerview來實現地址菜單的三級聯動效果
現在很多的app,尤其是電商類的app在添加地址功能裡面一般都會使用地址的三級聯動,那麼它是怎麼實現的呢?其實很簡單,現在簡單的介紹一下使用第三方的依賴來實現三級聯動的效果.
1.開始編寫
1).在mole的build.gradle文件中的dependencies節點裡面添加這樣一行代碼引入依賴
[html] view plain
compile 'com.bigkoo:pickerview:2.0.8'
2).項目的目錄結構
包括assets資產目錄,三個類文件,分別是activity的代碼邏輯類,省份的實體類以及獲取省份信息json字元串的工具類.
3)實體類編寫如下:
[java] view plain
public class AddressBean {
public String name;
public AddressBean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPickerViewText() {
//這里是固定寫法,依賴庫會根據集合內容使用反射顯示文本到省份欄的文本框中
return this.name;
}
@Override
public String toString() {
return "AddressBean{" +
"name='" + name + '\'' +
'}';
}
}
4).獲取json字元串的工具類代碼
[html] view plain
/**
* Created by yangtao on 2016/12/11.
* 從資產目錄中獲取json字元串
*/
public class JsonUtils {
public static String getJsonString(Context context,String name){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
AssetManager am = context.getAssets();
try {
InputStream inputStream = am.open(name);
byte[] buffer = new byte[1024];
int len =0;
while((len = inputStream.read(buffer)) != -1){
baos.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
return baos.toString();
}
}
5)MainActivity中的代碼實現
[java] view plain
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.bigkoo.pickerview.OptionsPickerView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView tv_address;
private ArrayList<AddressBean> provinceList = new ArrayList<>();//創建存放省份實體類的集合
private ArrayList<String> cities ;//創建存放城市名稱集合
private ArrayList<List<String>> citiesList= new ArrayList<>();//創建存放城市名稱集合的集合
private ArrayList<String> areas ;//創建存放區縣名稱的集合
private ArrayList<List<String>> areasList ;//創建存放區縣名稱集合的集合
private ArrayList<List<List<String>>> areasListsList = new ArrayList<>();//創建存放區縣集合的集合的集合
private OptionsPickerView mPvOptions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_address = (TextView) findViewById(R.id.tv_address);
//獲取json字元串,用來解析以獲取集合
String jsonString = JsonUtils.getJsonString(MainActivity.this,
"province_data.json");
//解析json字元串,向各級集合中添加元素
parseJson(jsonString);
mPvOptions = new OptionsPickerView(this);
//設置三級聯動的效果
mPvOptions.setPicker(provinceList,citiesList,areasListsList,true);
//設置可以循環滾動,true表示這一欄可以循環,false表示不可以循環
mPvOptions.setCyclic(true,false,false);
//設置默認選中的位置
mPvOptions.setSelectOptions(0,0,0);
mPvOptions.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3) {
//返回的分別是三個級別的選中位置
String city = provinceList.get(options1).getPickerViewText();
String address;
// 如果是直轄市或者特別行政區只設置市和區/縣
if ("北京市".equals(city) || "上海市".equals(city) || "天津市".equals(city) || "重慶市".equals(city) || "澳門".equals(city) || "香港".equals(city)) {
address = provinceList.get(options1).getPickerViewText()
+ " " + areasListsList.get(options1).get(option2).get(options3);
} else {
address = provinceList.get(options1).getPickerViewText()
+ " " + citiesList.get(options1).get(option2)
+ " " + areasListsList.get(options1).get(option2).get(options3);
}
tv_address.setText(address);
Toast.makeText(MainActivity.this,"我被點擊了",Toast.LENGTH_LONG).show();
}
});
//點擊文本框的時候,顯示地址選擇框
tv_address.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPvOptions.show();
}
});
}
//解析獲得的json字元串,放在各個集合中
private void parseJson(String json){
try {
//得到一個數組類型的json對象
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {//對數組進行遍歷得到每一個jsonobject對象
JSONObject provinceObject = (JSONObject) jsonArray.get(i);
String provinceName = provinceObject.getString("name");//得到省份的名字
provinceList.add(new AddressBean(provinceName));//向集合裡面添加元素
JSONArray cityArray = provinceObject.optJSONArray("city");
cities = new ArrayList<>();//創建存放城市名稱集合
areasList = new ArrayList<>();//創建存放區縣名稱的集合的集合
for (int j = 0; j < cityArray.length(); j++) {//遍歷每個省份集合下的城市列表
JSONObject cityObject = (JSONObject) cityArray.get(j);
String cityName = cityObject.getString("name");
cities.add(cityName);//向集合裡面添加元素
JSONArray areaArray = cityObject.optJSONArray("area");
areas = new ArrayList<>();//創建存放區縣名稱的集合
for (int k = 0; k < areaArray.length(); k++) {
String areaName = areaArray.getString(k);
areas.add(areaName);
}
areasList.add(areas);
}
citiesList.add(cities);
areasListsList.add(areasList);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
❷ android如何動態更新二級聯動spinner
spinner有一個setSelection(),將spinner設為全局變數後用spinner.setSelection(GestureConstant.FILE_GESTURE, false);就可以了。
貼一部分代碼,不完整。
Activity
[java] view plain
Intent fileIntent = new Intent(FileManager.this,
CreateGestureActivity.class);
fileIntent.putExtra("file", "file");
startActivity(fileIntent);
❸ 想做一個android 省市縣三級聯動,數據是從介面讀取,怎麼做
以前做過,數據是在本地xml裡面取的: 上面是省市區的xml數據網盤地址。 如果要做成從伺服器取,那麼就一次性取下來,然後還是一樣的流程。 如果你想選擇省再去取對應的市,那麼就要傳省的id去獲取對應的市,這時候就要有等待框,可能用戶體驗差一點。
❹ 關於android中spinner三級聯動的問題
http://blog.csdn.net/jdsjlzx/article/details/41789835
這里的一些信息希望可譯幫到你
❺ Android上這種布局和聯動的滑動效果是怎麼做到的
CoordinatorLayout+AppBar,desgin包里的。正確的做法就是自己處理滑動事件。建議先了解一下View的事件傳遞機制。這個問題我遇到過,寫了個viewgroup解決這個問題。scrollview裡面放viewpager,布局的時候手動設置viewpager的高度。viewpager的指示器做兩個,一個放scrollview裡面,一個放scrollview外面。
老版本的網易雲音樂 曾經用過這個效果。以前實現過這樣的效果。ViewPager頂部有一個Layout。下面ViewPager中的每個ListView有一個空白的Header當前頁面上下滑動的時候動態的根據Y值去改變頂部的Layout的Y值。當頁面左右滑動完成之後, 根據當前ListView的Y值.重新絲滑的改變頂部Layout的Y值。現在有個開源項目也能實現類似的效果。
❻ android 怎樣用scrollowview嵌套gridview來實現多級聯動
GridView(網格視圖)是按照行列的方式來顯示內容的,一般用於顯示圖片,圖片等內容,比如實現九宮格圖,用GridView是首選,也是最簡單的。主要用於設置Adapter。
1.GridView常用的XML屬性
屬性名稱 描述
android:columnWidth 設置列的寬度。
android:gravity 設置此組件中的內容在組件中的位置。可選的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical可以多選,用「|」分開。
android:horizontalSpacing 兩列之間的間距。
android:numColumns 設置列數。
android:stretchMode 縮放模式。
android:verticalSpacing 兩行之間的間距。
2.實例1
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<GridView
android:id="@+id/GridView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnWidth="90dp"
android:numColumns="3"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
❼ android中省級聯動一般用什麼控制項實現
Spinner上實現省市區三級聯動,話不多說了
城市信息我將他放在strings.xml文件中,具體就不給出了,信息太大了
主xml文件部分代碼如下:
[java] view plainprint?
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android=" "
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusableInTouchMode="false" >
<TableLayout
android:id="@+id/tableLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="20px"
android:stretchColumns="1" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="10px"
android:="false" >
<TextView
android:id="@+id/province_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="省份:"
>
</TextView>
<Spinner
android:id="@+id/province_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</Spinner>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="10px"
android:="false" >
<TextView
android:id="@+id/city_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="城市:" >
</TextView>
<Spinner
android:id="@+id/city_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</Spinner>
</TableRow>
<TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="10px"
android:="false" >
<TextView
android:id="@+id/county_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="縣城鎮:"
>
</TextView>
<Spinner
android:id="@+id/county_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</Spinner>
</TableRow>
<EditText
android:id="@+id/display_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:hint="輸出結果"
android:paddingTop="10px" >
</EditText>
</TableLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android=" "
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusableInTouchMode="false" >
❽ android中讀取資料庫內容到spinner 並實現二級聯動,出現
你的get方法返回值不是map<String,Integer>類型,發代碼上來看下 就get方法的
❾ android省市區多級聯動的布局怎麼實現的
使用相對布局,然後使用控制項spinner:
<Spinner
android:id="@+id/spinner03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/spinner02"
/>
❿ android中spinner如何實現省市二級聯動
Androidspinner實現省市二級聯動,需要自定義adpter,將數據源綁定到adpter,當點擊省時,觸發自定義響應事件,改變市,示例如下:
{
privateTextViewtextView;
privateSpinnerprovince;
privateSpinnercity;
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//String[]provinces=newString[]{"-省份-","河北省","山西省","北京"};
textView=(TextView)this.findViewById(R.id.textView);
province=(Spinner)this.findViewById(R.id.province);
city=(Spinner)this.findViewById(R.id.city);
//(處理省的顯示)
//將可選內容與ArrayAdapter的連接(從資源數組文件中獲取數據)
ArrayAdapter<CharSequence>adapter=
ArrayAdapter.createFromResource(this,R.array.province,android.R.layout.simple_spinner_item);
//newArrayAdapter<String>(this,android.R.layout.simple_spinner_item,provinces);
//設置下拉列表的風格
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//將數據綁定到Spinner視圖上
province.setAdapter(adapter);
//添加條目被選中監聽器
province.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener(){
@Override
publicvoidonItemSelected(AdapterView<?>parent,Viewview,intposition,longid){
//parent既是province對象
Spinnerspinner=(Spinner)parent;
Stringpro=(String)spinner.getItemAtPosition(position);
//(處理省的市的顯示)
//將默認值與ArrayAdapter連接(從資源數組文件中獲取數據)
ArrayAdapter<CharSequence>cityAdapter=ArrayAdapter.createFromResource
(MainActivity.this,R.array.citydefault,android.R.layout.simple_spinner_item);
//newArrayAdapter<CharSequence>
//(MainActivity.this,android.R.layout.simple_spinner_item,cities);
//獲取所在省含有哪些市(從資源數組文件中獲取數據)
if(pro.equals("河北省")){
cityAdapter=ArrayAdapter.createFromResource
(MainActivity.this,R.array.hb,android.R.layout.simple_spinner_item);
}elseif(pro.equals("北京市")){
cityAdapter=ArrayAdapter.createFromResource
(MainActivity.this,R.array.bj,android.R.layout.simple_spinner_item);
}elseif(pro.equals("山西省")){
cityAdapter=ArrayAdapter.createFromResource
(MainActivity.this,R.array.shx,android.R.layout.simple_spinner_item);
}
//綁定數據到Spinner(City)上
city.setAdapter(cityAdapter);
}
@Override
publicvoidonNothingSelected(AdapterView<?>parent){
}
});
}
}