本人小白,那个大神看到有问题可指出,谢谢。。。。
一:Android studio
1);先进行准备前工作先 在build.gradle四个地方要加入代码
//Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
mavenCentral()//apllay//add plugin
}
dependencies {
classpath'com.android.tools.build:gradle:2.3.3'classpath'org.greenrobot:greendao-gradle-plugin:3.2.2' //add plugin//NOTE: Do not place your application dependencies here; they belong//in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 这个非常重要,会生成Dao的类
greendao { //add plugin
schemaVersion 2
//生成greedao的对象类的路径
设置DaoMaster,DaoSession,Dao包的路径,我不太喜欢它原来的路径,每次找都很麻烦,所以把它放在一个自己方便看的路径下来,你也可以不要下面这两句!
daoPackage 'zhu.com.sprnner_cbo.greendao'
targetGenDir 'src/main/java'//保存到java代码路径 ==》这句你可以不要
}
如果没有这俩句,那么DaoMaster,DaoSession,Dao的原路径是在这里的
有这俩句,那么DaoMaster,DaoSession,Dao那么路径挺好找的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
apply plugin: 'com.android.application'apply plugin:'org.greenrobot.greendao'//add plugin
android {
compileSdkVersion26buildToolsVersion"27.0.3"defaultConfig {
applicationId"com.example.pearl.customdropdownbox"minSdkVersion15targetSdkVersion26versionCode1versionName"1.0"testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"}
buildTypes {
release {
minifyEnabledfalseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}
}
}//这个非常重要,会生成Dao的类
greendao { //add plugin
schemaVersion 2
//生成greedao的对象类的路径 ==》我不太喜欢它原来的路径,所以把它放在一个自己方便看的路径下来,所以这句你可以不要!
daoPackage 'com.example.pearl.customdropdownbox.greendao'targetGenDir'src/main/java'//保存到java代码路径 ==》这句你可以不要
}
dependencies {
compile fileTree(dir:'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group:'com.android.support', module: 'support-annotations'})
compile'com.android.support:appcompat-v7:26.+'compile'com.android.support.constraint:constraint-layout:1.0.2'testCompile'junit:junit:4.12'compile'com.loopj.android:android-async-http:1.4.9'//add library==》这个是添加 网络请求的插件
compile 'org.greenrobot:greendao:3.2.2' //add library ==>这个是 添加 greedao插件
}
build.gradle
a):因为需要网络的请求 所以 要必须 要在AndroidManifest.xml加一句代码,不加就会出现下面这种错误的情况
12-26 02:45:25.969 5267-5334/zhu.com.sprnner_cbo W/System.err: java.net.SocketException: Permission denied12-26 02:45:25.970 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.net.Socket.createImpl(Socket.java:473)12-26 02:45:25.970 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.net.Socket.getImpl(Socket.java:536)12-26 02:45:25.971 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.net.Socket.setSoTimeout(Socket.java:1127)12-26 02:45:25.971 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:116)12-26 02:45:25.971 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:157)12-26 02:45:25.971 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.conn.scheme.SchemeSocketFactoryAdaptor.connectSocket(SchemeSocketFactoryAdaptor.java:65)12-26 02:45:25.972 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)12-26 02:45:25.972 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:145)12-26 02:45:25.972 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:131)12-26 02:45:25.972 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)12-26 02:45:25.973 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)12-26 02:45:25.973 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:860)12-26 02:45:25.973 5267-5334/zhu.com.sprnner_cbo W/System.err: at cz.msebera.android.httpclient.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)12-26 02:45:25.973 5267-5334/zhu.com.sprnner_cbo W/System.err: at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:146)12-26 02:45:25.974 5267-5334/zhu.com.sprnner_cbo W/System.err: at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:177)12-26 02:45:25.974 5267-5334/zhu.com.sprnner_cbo W/System.err: at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:106)12-26 02:45:25.974 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)12-26 02:45:25.974 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)12-26 02:45:25.975 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)12-26 02:45:25.975 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)12-26 02:45:25.975 5267-5334/zhu.com.sprnner_cbo W/System.err: at java.lang.Thread.run(Thread.java:761)
错误情况
好了配置弄好剩下的就 很好解决了
b):设置实体类:
实体类 要根据返回的json中 相对于的key 一一对应
注意: 主键:id必须要设置Long的类型 ,切记 必须要加入 @Entity, 和@Id
设置好变量后 ,还有一个操作 设置 生成DaoMaster,DaoSession,Dao类的操作,这它就会自动补全我们实体类剩下的get和set的方法了
================生成的========》
最后在实体类中再加 一个方法 得到 从 服务器专递的json的数据
// 将json ==>转化为 Bean的对象(即Tb_Cbo_CLDL的对象)
public static Tbmep json_To_Bean(JSONObject object){
try {
return new Tbmep(object.getLong("did"),
object.getString("dname")
);
}catch (Exception e){ }
return null;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~··
Tbmep
packagecom.example.pearl.customdropdownbox;importorg.greenrobot.greendao.annotation.Entity;importorg.greenrobot.greendao.annotation.Id;importorg.greenrobot.greendao.annotation.Generated;importorg.json.JSONObject;/*** Created by Pearl on 2017/12/27.*/@Entitypublic classTbmep {
@IdprivateLong did;privateString dname;
@Generated(hash= 1103728403)publicTbmep(Long did, String dname) {this.did =did;this.dname =dname;
}
@Generated(hash= 1857599075)publicTbmep() {
}publicLong getDid() {return this.did;
}public voidsetDid(Long did) {this.did =did;
}publicString getDname() {return this.dname;
}public voidsetDname(String dname) {this.dname =dname;
}//将json ==>转化为 Bean的对象(即Tb_Cbo_CLDL的对象)
public staticTbmep json_To_Bean(JSONObject object){try{return new Tbmep(object.getLong("did"),
object.getString("dname")
);
}catch(Exception e){ }return null;
}
}
2):界面
a):activity_cbo.xml
>
b):spiner_item_layout.xml
spiner_listview_layout.xml
需要用到 一些应用来设置界面
a):values的设置
b)drawable的设置
btn_click_radius_press.xml
btn_press.xml
btn_radius.xml
etitext_frame_radiuo.xml
sprinner_line_background.xml
>
/>
3):代码
MyBaseAdapter
packagecom.example.pearl.customdropdownbox;importandroid.content.Context;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.TextView;importjava.util.List;/*** Created by XiaoZhu on 2017/9/26.*/
public class MyBaseAdapter extendsBaseAdapter {public static interfaceIOnItemSelectListener {public void onItemClick(intpos);
}
;private ListmObjects;privateLayoutInflater mInflater;public MyBaseAdapter(Context context, ListmObjects) {this.mObjects =mObjects;
mInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}public void refreshData(List objects, intselIndex) {
mObjects=objects;if (selIndex < 0) {
selIndex= 0;
}if (selIndex >=mObjects.size()) {
selIndex= mObjects.size() - 1;
}
}
@Override//在此适配器中所代表的数据集的条目数
public intgetCount() {returnmObjects.size();
}
@Override//获取数据集中与指定索引对应的数据项
public Object getItem(intpos) {returnmObjects.get(pos).toString();
}
@Override//取在列表中与指定索引对应的行id
public long getItemId(intpos) {returnpos;
}
@Override//下面的是重点
public View getView(intpos, View convertView, ViewGroup arg2) {
ViewHolder viewHolder;if (convertView == null) {
convertView= mInflater.inflate( R.layout.spiner_item_layout, null);
viewHolder= newViewHolder();
viewHolder.mTextView=(TextView) convertView.findViewById(R.id.textView);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder) convertView.getTag();
}//Object item = getItem(pos);
viewHolder.mTextView.setText(mObjects.get(pos));returnconvertView;
}public static classViewHolder {publicTextView mTextView;
}
}
SpinerPopWindow
packagecom.example.pearl.customdropdownbox;importandroid.content.Context;importandroid.graphics.drawable.ColorDrawable;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup.LayoutParams;importandroid.widget.AdapterView;importandroid.widget.ListView;importandroid.widget.PopupWindow;importjava.util.List;/*** Created by XiaoZhu on 2017/12/12.*/
public class SpinerPopWindow extends PopupWindow implementsAdapterView.OnItemClickListener {privateContext mContext;privateListView mListView;privateMyBaseAdapter mAdapter;privateMyBaseAdapter.IOnItemSelectListener mItemSelectListener;publicSpinerPopWindow(Context context) {super(context);
mContext=context;
init();
}public voidsetItemListener(MyBaseAdapter.IOnItemSelectListener listener) {
mItemSelectListener=listener;
}public voidsetAdatper(MyBaseAdapter adapter) {
mAdapter=adapter;
mListView.setAdapter(mAdapter);
}private voidinit() {
View view= LayoutInflater.from(mContext).inflate(R.layout.spiner_listview_layout, null);
setContentView(view);
setWidth(LayoutParams.WRAP_CONTENT);
setHeight(LayoutParams.WRAP_CONTENT);
setFocusable(true);
ColorDrawable dw= new ColorDrawable(0x00);
setBackgroundDrawable(dw);
mListView=(ListView) view.findViewById(R.id.listview);
mListView.setOnItemClickListener(this);
}public void refreshData(List list, intselIndex) {if (list != null && selIndex != -1) {if (mAdapter != null) {
mAdapter.refreshData(list, selIndex);
}
}
}
@Overridepublic void onItemClick(AdapterView> arg0, View view, int pos, longarg3) {
dismiss();if (mItemSelectListener != null) {
mItemSelectListener.onItemClick(pos);
}
}
}
CBOActivity
packagecom.example.pearl.customdropdownbox;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.ArrayAdapter;importandroid.widget.RelativeLayout;importandroid.widget.Spinner;importandroid.widget.TextView;importandroid.widget.Toast;importcom.loopj.android.http.AsyncHttpClient;importcom.loopj.android.http.AsyncHttpResponseHandler;importorg.json.JSONArray;importorg.json.JSONException;importorg.json.JSONObject;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.List;importcz.msebera.android.httpclient.Header;public class CBOActivity extends Activity implementsView.OnClickListener ,MyBaseAdapter.IOnItemSelectListener {private List< String> list_Tbmep =null;privateTextView tv_sprnner_Tbmep;privateMyBaseAdapter mAdapter;privateRelativeLayout relativeLayout;privateSpinerPopWindow mSpinerPopWindow;private List list_cboTbmep=null;private long TbmepID=0;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cbo);
relativeLayout=(RelativeLayout) findViewById(R.id.relativelayout);
relativeLayout.setOnClickListener(this);//自已下拉框
tv_sprnner_Tbmep=(TextView) findViewById(R.id.kj_tv_tbmep);
}
@Overridepublic voidonClick(View view) {switch(view.getId()) {caseR.id.relativelayout:
cbo_tbmep();break;
}
}
@Overridepublic void onItemClick(intpos) {
TbmepID=list_cboTbmep.get((int) pos).getDid();
String value=list_Tbmep.get(pos);
tv_sprnner_Tbmep.setText(value.toString());
}public voidcbo_tbmep(){
AsyncHttpClient client=newAsyncHttpClient();//第一个参数是访问 后台的路径,第二是:参数根据 id获取 string 查询数据 ,第三个:回调函数
client.get("http://192.168.191.2:8080/2017_1214_cbo/Binding_Cbo/android_cbo.json", null, newAsyncHttpResponseHandler() {
@Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {if (statusCode==200){try{
JSONObject object= new JSONObject(new String(responseBody));//获取json数据
JSONArray jsonArray = object.getJSONArray("cbo_bm");//获取数据集名称为obj的数据
Log.d("jsonArray数据输出:", String.valueOf(jsonArray));
list_cboTbmep= new ArrayList<>();for(int i=0;i
JSONObject json_one=jsonArray.getJSONObject(i);//把 json 转换为 ==》bean的对象形式//方法1;
Tbmep cbo=Tbmep.json_To_Bean(json_one);if (cbo!=null){
list_cboTbmep.add(cbo);//把对象放入 list的数组中
}
}if (jsonArray.length() > 0) {//TbmepID = list_cboTbmep.get(0).getDid();
list_Tbmep = new ArrayList< String >();for (int i = 0; i < list_cboTbmep.size(); i++) {
Tbmep section=list_cboTbmep.get(i);
list_Tbmep.add(section.getDname());
}
}
mAdapter=new MyBaseAdapter(CBOActivity.this,list_Tbmep);
mAdapter.refreshData(list_Tbmep,0);//初始化PopWindow
mSpinerPopWindow = new SpinerPopWindow(CBOActivity.this);
mSpinerPopWindow.setAdatper(mAdapter);
mSpinerPopWindow.setItemListener(CBOActivity.this);
showSpinWindow();//显示SpinerPopWindow
} catch(JSONException e) {
Toast.makeText(CBOActivity.this, "下拉框加载失败!", Toast.LENGTH_SHORT).show();
}
mAdapter.notifyDataSetChanged();//数据加载 完毕, 通知列表去更新
}else if(statusCode==400){
Toast.makeText(CBOActivity.this, "若返回值400,则是返回网络异常!", Toast.LENGTH_SHORT).show();
}
}
@Overridepublic void onFailure(int statusCode,cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {
}
}) ;
}//设置PopWindow
private voidshowSpinWindow() {//设置mSpinerPopWindow显示的宽度
mSpinerPopWindow.setWidth(relativeLayout.getWidth());//设置显示的位置在哪个控件的下方
mSpinerPopWindow.showAsDropDown(relativeLayout);
}
}
运行效果: