diff --git a/app/build.gradle b/app/build.gradle index c5e746b..c6daccc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,6 +21,10 @@ android { versionName '1.0.1' testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true + /*jackOptions { + enabled true + }*/ +// 适用java8属性 } buildTypes { release { @@ -31,6 +35,10 @@ android { } productFlavors { } + compileOptions { + targetCompatibility 1.7 + sourceCompatibility 1.7 + } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') @@ -68,6 +76,7 @@ dependencies { compile 'com.jakewharton:butterknife:8.5.1' compile 'com.android.support:support-v4:24.2.1' compile 'com.android.support:support-vector-drawable:24.2.1' + compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' debugCompile 'com.github.moduth:blockcanary-android:1.2.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index be15bad..be559ca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,8 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme0"> - + @@ -48,8 +49,10 @@ //key:开发者申请的Key - + android:label="@string/title_activity_settings" /> + + \ No newline at end of file diff --git a/app/src/main/java/com/example/owen/weathergo/common/util/DBManager.java b/app/src/main/java/com/example/owen/weathergo/common/util/DBManager.java new file mode 100644 index 0000000..100b9e1 --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/common/util/DBManager.java @@ -0,0 +1,88 @@ +package com.example.owen.weathergo.common.util; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.os.Environment; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.example.owen.weathergo.R; +import com.example.owen.weathergo.base.BaseApplication; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by owen on 2017/4/25. + */ + +public class DBManager { + + private static String TAG = DBManager.class.getSimpleName(); + public static final String DB_NAME = "china_city.db"; //数据库名字 + public static final String PACKAGE_NAME = "com.example.owen.weathergo"; + public static final String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath() + "/" + + PACKAGE_NAME; //在手机里存放数据库的位置(/data/data/com.example.owen.weathergo/china_city.db) + private SQLiteDatabase database; + private Context context; + + private DBManager() { + + } + + public static DBManager getInstance() { + return DBManagerHolder.sInstance; + } + + private static final class DBManagerHolder { + public static final DBManager sInstance = new DBManager(); + } + + public SQLiteDatabase getDatabase() { + return database; + } + + + public void openDatabase() { + //Log.e(TAG, DB_PATH + "/" + DB_NAME); + this.database = this.openDatabase(DB_PATH + "/" + DB_NAME); + } + + @Nullable + private SQLiteDatabase openDatabase(String dbfile) { + + try { + if (!(new File(dbfile).exists())) { + //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库 + InputStream is = BaseApplication.getAppContext().getResources().openRawResource(R.raw.china_city); //欲导入的数据库 + FileOutputStream fos = new FileOutputStream(dbfile); + int BUFFER_SIZE = 400000; + byte[] buffer = new byte[BUFFER_SIZE]; + int count; + while ((count = is.read(buffer)) > 0) { + fos.write(buffer, 0, count); + } + fos.close(); + is.close(); + } + return SQLiteDatabase.openOrCreateDatabase(dbfile, null); + } catch (FileNotFoundException e) { + Log.e("File not found",""); + e.printStackTrace(); + } catch (IOException e) { + Log.e("IO exception",""); + e.printStackTrace(); + } + + return null; + } + + public void closeDatabase() { + if (this.database != null) { + this.database.close(); + } + } +} diff --git a/app/src/main/java/com/example/owen/weathergo/common/util/JSONUtil.java b/app/src/main/java/com/example/owen/weathergo/common/util/JSONUtil.java index 2bb3e70..1bd8754 100644 --- a/app/src/main/java/com/example/owen/weathergo/common/util/JSONUtil.java +++ b/app/src/main/java/com/example/owen/weathergo/common/util/JSONUtil.java @@ -38,6 +38,7 @@ public class JSONUtil { static ArrayList dfLists = new ArrayList(); public static WeatherBean getWeatherBeans(final Context context, String sCity) { + dfLists = null; /** * 处理从heweather网站上获取的json代码,进行解析赋值操作的静态方法 */ @@ -49,7 +50,7 @@ public static WeatherBean getWeatherBeans(final Context context, String sCity) { .build(); //Retrofit创建一个BlogService的代理对象 WgClient service = retrofit.create(WgClient.class); - Call call = service.mWeatherAPI("kaifeng", "b2a628bc1de942dc869fcbe524c65313"); + Call call = service.mWeatherAPI(sCity, "b2a628bc1de942dc869fcbe524c65313"); String jss = ""; call.enqueue(new Callback() { String jsonText = ""; diff --git a/app/src/main/java/com/example/owen/weathergo/common/util/WeatherDB.java b/app/src/main/java/com/example/owen/weathergo/common/util/WeatherDB.java new file mode 100644 index 0000000..43b6408 --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/common/util/WeatherDB.java @@ -0,0 +1,71 @@ +package com.example.owen.weathergo.common.util; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.Build; +import android.support.annotation.RequiresApi; + +import com.example.owen.weathergo.modules.dao.City; +import com.example.owen.weathergo.modules.dao.Province; + +import java.io.Closeable; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +//import okhttp3.internal.Util; + +public class WeatherDB { + + public WeatherDB() { + + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + public static List loadProvinces(SQLiteDatabase db) { + + List list = new ArrayList<>(); + + //DMBManager类复制数据库操作已再设备上验证成功(coolpad8297 API19) + Cursor cursor = db.query("T_Province", null, null, null, null, null, null); + + if (cursor.moveToFirst()) { + do { + Province province = new Province(); + province.setProSort(cursor.getInt(cursor.getColumnIndex("ProSort"))); + province.setProName(cursor.getString(cursor.getColumnIndex("ProName"))); + list.add(province); + } while (cursor.moveToNext()); + } + closeQuietly(cursor); + return list; + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + public static List loadCities(SQLiteDatabase db, int ProID) { + List list = new ArrayList<>(); + Cursor cursor = db.query("T_City", null, "ProID = ?", new String[] { String.valueOf(ProID) }, null, null, null); + if (cursor.moveToFirst()) { + do { + City city = new City(); + city.setCityName(cursor.getString(cursor.getColumnIndex("CityName"))); + city.setProID(ProID); + city.setCitySort(cursor.getInt(cursor.getColumnIndex("CitySort"))); + list.add(city); + } while (cursor.moveToNext()); + } + closeQuietly(cursor); + return list; + } + + + public static void closeQuietly(Closeable closeable) { + if (null != closeable) { + try { + closeable.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/owen/weathergo/modules/dao/City.java b/app/src/main/java/com/example/owen/weathergo/modules/dao/City.java new file mode 100644 index 0000000..e631f9a --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/modules/dao/City.java @@ -0,0 +1,38 @@ +package com.example.owen.weathergo.modules.dao; + +import java.io.Serializable; + +/** + * Created by owen on 2017/4/25. + */ + +public class City implements Serializable { + private String CityName; + private int ProID; + + public String getCityName() { + return CityName; + } + + public void setCityName(String cityName) { + CityName = cityName; + } + + public int getProID() { + return ProID; + } + + public void setProID(int proID) { + ProID = proID; + } + + public int getCitySort() { + return CitySort; + } + + public void setCitySort(int citySort) { + CitySort = citySort; + } + + private int CitySort; +} diff --git a/app/src/main/java/com/example/owen/weathergo/modules/dao/CityViewHolder.java b/app/src/main/java/com/example/owen/weathergo/modules/dao/CityViewHolder.java new file mode 100644 index 0000000..1c26520 --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/modules/dao/CityViewHolder.java @@ -0,0 +1,53 @@ +package com.example.owen.weathergo.modules.dao; + +import android.support.v7.widget.CardView; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import com.example.owen.weathergo.R; +import com.example.owen.weathergo.base.BaseViewHolder; +import com.example.owen.weathergo.modules.main.adapter.CityAdapter; + +import butterknife.OnClick; + +/** + * Created by owen on 2017/4/25. + */ + +public class CityViewHolder extends BaseViewHolder implements View.OnClickListener{ + + TextView mItemCity; + public CardView mCardView; + private CityAdapter.OnRecyclerViewItemClickListener mOnItemClickListener = null; + + + public CityViewHolder(View itemView) { + super(itemView); + mCardView = (CardView) itemView.findViewById(R.id.city_cardView); + mItemCity = (TextView) itemView.findViewById(R.id.city_txt); + mCardView.setOnClickListener((View.OnClickListener) this); + + } + + @Override + public void bind(String s) { + Log.i("CityViewHolderBind",""+s); +// mItemCity.setText("城市"); + mItemCity.setText(s); + } + + + @Override + public void onClick(View v) { + if(mOnItemClickListener != null){ + mOnItemClickListener.onItemClick(v,(Integer) itemView.getTag()); + Log.i("CityViewHolderOnclivk",""); + } + } + + + public interface OnRecyclerViewItemClickListener { + void onItemClick(View view, int pos); + } +} diff --git a/app/src/main/java/com/example/owen/weathergo/modules/dao/Province.java b/app/src/main/java/com/example/owen/weathergo/modules/dao/Province.java new file mode 100644 index 0000000..923596e --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/modules/dao/Province.java @@ -0,0 +1,29 @@ +package com.example.owen.weathergo.modules.dao; + +/** + * Created by owen on 2017/4/25. + */ + +public class Province { + private String ProName; + private int ProSort; + + public String getProName() { + return ProName; + } + + public void setProName(String proName) { + ProName = proName; + } + + public int getProSort() { + return ProSort; + } + + public void setProSort(int proSort) { + ProSort = proSort; + } + + + +} diff --git a/app/src/main/java/com/example/owen/weathergo/modules/main/activity/ChoiceCityActivity.java b/app/src/main/java/com/example/owen/weathergo/modules/main/activity/ChoiceCityActivity.java new file mode 100644 index 0000000..d2acceb --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/modules/main/activity/ChoiceCityActivity.java @@ -0,0 +1,172 @@ +package com.example.owen.weathergo.modules.main.activity; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.RequiresApi; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; + +import com.example.owen.weathergo.R; +import com.example.owen.weathergo.common.util.DBManager; +import com.example.owen.weathergo.common.util.WeatherDB; +import com.example.owen.weathergo.modules.dao.City; +import com.example.owen.weathergo.modules.dao.Province; +import com.example.owen.weathergo.modules.main.adapter.CityAdapter; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class ChoiceCityActivity extends AppCompatActivity { + @BindView(R.id.city_recycle) + RecyclerView mCityRecy; + + private ArrayList dataList = new ArrayList<>(); + private Province selectedProvince; + private int proNum; + private City selectedCity; + private List provincesList = new ArrayList<>(); + private List cityList = new ArrayList<>(); + + private CityAdapter mAdapter; + + public static final int LEVEL_PROVINCE = 1; + public static final int LEVEL_CITY = 2; + private int currentLevel; + + private boolean isChecked = false; + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choise_city); + ButterKnife.bind(this); + currentLevel = 0; + /*dataList.add("洛阳"); + dataList.add("开封"); + dataList.add("北京");*/ + + queryProvince(); + /*Observable.defer(() -> { + //mDBManager = new DBManager(ChoiceCityActivity.this); + DBManager.getInstance().openDatabase(); + return Observable.just(1); + }).compose(RxUtils.rxSchedulerHelper()) + .compose(this.bindToLifecycle()) + .subscribe(integer -> { + initRecyclerView(); + queryProvinces(); + });*/ + DBManager.getInstance().openDatabase(); + initRecycleView(); + + } + + private void initRecycleView() { + mCityRecy.setLayoutManager(new LinearLayoutManager(this)); + mCityRecy.setHasFixedSize(true); + mAdapter = new CityAdapter(this, dataList); + mCityRecy.setAdapter(mAdapter); + Log.i("ChoiceCityActivityOnItc", "ready to bind"); + mAdapter.setOnItemClickListener(new CityAdapter.OnRecyclerViewItemClickListener() { + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + @Override + public void onItemClick(View view, int pos) { + Log.i("ChoiceCityActivityOnItc", "" + dataList.get(pos) + pos); + if (currentLevel == 0) { +// selectedProvince.setProName(dataList.get(pos)); +// selectedProvince.setProSort(pos + 1); + Log.i("ChoiceCityActivityOnItcP", "" + dataList.get(pos) + pos); + queryCities(pos + 1); + } else if (currentLevel == 1) { + //TODO 替代WeatherMain的主查询城市,并直接跳转到WeatherMain界面,传递值为城市名 + + //http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html +// selectedCity.setCityName(dataList.get(pos) + ""); +// selectedCity.setCitySort(0);//暂时没有用到所以没有去查询 +// selectedCity.setProID(selectedProvince.getProSort()); +// Intent intent = new Intent(); +// intent.setClass(ChoiceCityActivity.this, WeatherMain.class); +// Bundle bundle = new Bundle(); +// bundle.putSerializable("city", selectedCity); +// intent.putExtras(bundle); +// startActivity(intent); + + SharedPreferences preferences; + preferences = getApplicationContext().getSharedPreferences("huang", MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.remove("city"); + editor.putString("city", dataList.get(pos)); + editor.commit(); + finish(); + +// Intent intent = new Intent(); +// intent.setClass(ChoiceCityActivity.this, WeatherMain.class); +// Bundle bundle = new Bundle(); +// bundle.putSerializable("city", dataList.get(pos)); +// intent.putExtras(bundle); +// startActivity(intent); + } + //暂时没有从数据库中读取ProId而是从排列顺序中+1而得,有点走钢丝,后面deltWeek测试再考虑 + } + }); + Log.i("ChoiceCityActivityOnItc", "has binded"); + + } + + private void quit() { + ChoiceCityActivity.this.finish(); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + } + + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + public void queryCities(int ProId) { + if (cityList.isEmpty()) { + DBManager.getInstance().openDatabase(); + Log.i("ChoiceCityActivityQP", "" + DBManager.getInstance().getDatabase()); + cityList.addAll(WeatherDB.loadCities(DBManager.getInstance().getDatabase(), ProId)); + DBManager.getInstance().closeDatabase(); + } + dataList.clear(); + for (City city : cityList) { + dataList.add(city.getCityName()); + } + currentLevel = 1;//城市级 + mAdapter.notifyDataSetChanged(); +// dataList.clear(); + + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + public void queryProvince() { + if (provincesList.isEmpty()) { + DBManager.getInstance().openDatabase(); + Log.i("ChoiceCityActivityQP", "" + DBManager.getInstance().getDatabase()); + provincesList.addAll(WeatherDB.loadProvinces(DBManager.getInstance().getDatabase())); + DBManager.getInstance().closeDatabase(); + } + dataList.clear(); + + for (Province province : provincesList) { + dataList.add(province.getProName()); + } +// mAdapter.notifyDataSetChanged(); +// dataList.addAll(provincesList); + currentLevel = 0;//省级 + } + + //启动Activity方法 + public static void launch(Context context) { + context.startActivity(new Intent(context, ChoiceCityActivity.class)); + } +} diff --git a/app/src/main/java/com/example/owen/weathergo/modules/main/activity/WeatherMain.java b/app/src/main/java/com/example/owen/weathergo/modules/main/activity/WeatherMain.java index 87ef140..182eb67 100644 --- a/app/src/main/java/com/example/owen/weathergo/modules/main/activity/WeatherMain.java +++ b/app/src/main/java/com/example/owen/weathergo/modules/main/activity/WeatherMain.java @@ -2,6 +2,7 @@ import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -25,9 +26,7 @@ import android.view.MenuItem; import android.view.View; import android.view.Window; -import android.widget.Button; import android.widget.EditText; -import android.widget.TextView; import android.widget.Toast; import com.example.owen.weathergo.R; @@ -58,7 +57,6 @@ public class WeatherMain extends AppCompatActivity //http://jakewharton.github.io/butterknife/ - @BindView(R.id.tl_custom) Toolbar mToolBar; @BindView(R.id.dl_left) @@ -77,13 +75,13 @@ public class WeatherMain extends AppCompatActivity WeatherAdapter mWeatherAdapter; private ActionBarDrawerToggle mDrawerToggle; - private ArrayList mDFList = new ArrayList<>(); - private String mCityStr = "kaifeng"; - private String mGCityStr = ""; + // private ArrayList mDFList = new ArrayList<>(); + private String mCityStr = "";//设置的CityName + private String mGCityStr = "";//从和风天气查询到的城市名称CityName,理论上和设置的一样 private List dlForecastList = new ArrayList(); - private WeatherBean weatherBean; private View view1, view2; private List viewList;//view数组 + Bundle savedInstanceState; //分别为查询结果国家,最低温度,最高温度,当前温度,风速 @RequiresApi(api = Build.VERSION_CODES.KITKAT) @@ -97,8 +95,44 @@ protected void onCreate(Bundle savedInstanceState) { setListener(); getWeather(); + Log.i("WeatherMainOncr", ""); + } + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + @Override + protected void onRestart() { + super.onRestart(); + + Log.i("ChoiceCityActivityOnItcC", "8"); + SharedPreferences preferences; + preferences = getApplicationContext().getSharedPreferences("huang", MODE_PRIVATE); +// SharedPreferences.Editor editor = preferences.edit(); + String Ccity = preferences.getString("city", ""); + mCityStr = Ccity; + Log.i("huangshaohua", "onstart" + Ccity); +/* + try{Intent intent = this.getIntent();//接收传来的city信息 + String Ccity = (String)intent.getSerializableExtra("city"); + if (Ccity != null) { + mCityStr = Ccity; + Log.i("huangshaohua",""+Ccity); + } + + }catch (Exception e){ + + } +*/ + +// getWeather(); +// Log.i("ChoiceCityActivityOnItcC", "9" ); +// getWeather(); + initRecycleView(); + refresh(); +// Log.i("ChoiceCityActivityOnItcC", "10" + mCityStr); +// City city = (City) intent.getSerializableExtra("city"); + + } public void setListener() { /** @@ -125,13 +159,14 @@ public void onClick(View v) { //大头鬼Bruce的译文 深入浅出RxJava系列 http://blog.csdn.net/lzyzsd/article/category/2767743 @RequiresApi(api = Build.VERSION_CODES.KITKAT) public void getWeather() { + Log.i("huangshaohau4", mCityStr); + mRecycleView.setLayoutManager(new LinearLayoutManager(this)); try { - WeatherBean weatherBean = JSONUtil.getWeatherBeans(this, mCityStr); - mRecycleView.setAdapter(mWeatherAdapter = new WeatherAdapter(getWindow().getDecorView(), dlForecastList, weatherBean)); - mGCityStr = weatherBean.getCity(); - mToolBar.setTitle("" + mGCityStr); - - mDFList = JSONUtil.getDForecast(); + Log.i("huangshaohua5", "" + mCityStr); + WeatherBean weatherBean = null; + weatherBean = JSONUtil.getWeatherBeans(this, mCityStr); + Log.i("huangshaohau6", weatherBean.getCity()); + ArrayList mDFList = JSONUtil.getDForecast(); Log.i("wtfs", mDFList.toString()); int i = 0; for (DailyForecast df : mDFList @@ -147,11 +182,19 @@ public void getWeather() { dlForecastList.add(dls); i++; } + Log.i("huangshaohau7", weatherBean.getCity()); + mRecycleView.setAdapter(mWeatherAdapter = new WeatherAdapter(getWindow().getDecorView(), dlForecastList, weatherBean)); + mGCityStr = weatherBean.getCity(); + Log.i("huangshaohua8", "" + weatherBean.getCity()); + mToolBar.setTitle("" + mGCityStr); + + } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, " 定位失败,请手动输入城市", Toast.LENGTH_LONG).show(); } - Toast.makeText(this, "加载完毕,✺◟(∗❛ัᴗ❛ั∗)◞✺,", Toast.LENGTH_LONG).show(); + Toast.makeText(this, "加载完毕,✺◟(∗❛ัᴗ❛ั∗)◞✺,", Toast.LENGTH_SHORT).show(); + } //@Override @@ -198,11 +241,17 @@ protected void onDestroy() { super.onDestroy(); } - + /** + * 初始化各个变量 + */ public void init() { - /** - * 初始化各个变量 - */ + Log.i("ChoiceCityActivityOnItcC", "8"); + SharedPreferences preferences; + preferences = getApplicationContext().getSharedPreferences("huang", MODE_PRIVATE); +// SharedPreferences.Editor editor = preferences.edit(); + String Ccity = preferences.getString("city", ""); + mCityStr = Ccity; + Log.i("huangshaohua", "onstart" + Ccity); mToolBar.setTitle(getResources().getString(R.string.weather_app_name)); setSupportActionBar(mToolBar); getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用 @@ -259,6 +308,7 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { Log.d("onSelected", "id=" + item.getItemId()); switch (item.getItemId()) { case R.id.nav_city: + ChoiceCityActivity.launch(WeatherMain.this); Log.i(TAG + "navigation", "nav_city"); break; case R.id.nav_multi_cities: @@ -287,35 +337,11 @@ public void initRecycleView() { // 下拉时触发SwipeRefreshLayout的下拉动画,动画完毕之后就会回调这个方法 mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onRefresh() { - - // 开始刷新,设置当前为刷新状态 - //swipeRefreshLayout.setRefreshing(true); - - // 这里是主线程 - // 一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行 - // TODO 获取数据 - new Handler().postDelayed(new Runnable() { - @RequiresApi(api = Build.VERSION_CODES.KITKAT) - @Override - public void run() { - - dlForecastList.clear(); - mRecycleView.removeAllViews(); - - getWeather(); - mWeatherAdapter.notifyDataSetChanged(); - - Toast.makeText(WeatherMain.this, "刷新了数据", Toast.LENGTH_SHORT).show(); - - // 加载完数据设置为不刷新状态,将下拉进度收起来 - mRefreshLayout.setRefreshing(false); - } - }, 1200); - - // 这个不能写在外边,不然会直接收起来 - //swipeRefreshLayout.setRefreshing(false); +// getWeather(); + refresh(); } }); @@ -326,6 +352,41 @@ public void run() { } + public void refresh() { + { + + Log.i("huangshaohau1", mCityStr); + // 开始刷新,设置当前为刷新状态 + //swipeRefreshLayout.setRefreshing(true); + + // 这里是主线程 + // 一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行 + // TODO 获取数据 + new Handler().postDelayed(new Runnable() { + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + @Override + + public void run() { + Log.i("huangshaohau2", mCityStr); + dlForecastList.clear(); + mRecycleView.removeAllViews(); + Log.i("huangshaohau3", mCityStr); + getWeather(); + Log.i("huangshaohau9", mGCityStr); + mWeatherAdapter.notifyDataSetChanged(); + Log.i("huangshaohau10", mGCityStr); +// Toast.makeText(WeatherMain.this, "刷新了数据", Toast.LENGTH_SHORT).show(); + + // 加载完数据设置为不刷新状态,将下拉进度收起来 + mRefreshLayout.setRefreshing(false); + } + }, 1200); + + // 这个不能写在外边,不然会直接收起来 + //swipeRefreshLayout.setRefreshing(false); + } + } + //设置双击推出 @Override public void onBackPressed() { diff --git a/app/src/main/java/com/example/owen/weathergo/modules/main/adapter/CityAdapter.java b/app/src/main/java/com/example/owen/weathergo/modules/main/adapter/CityAdapter.java new file mode 100644 index 0000000..8008725 --- /dev/null +++ b/app/src/main/java/com/example/owen/weathergo/modules/main/adapter/CityAdapter.java @@ -0,0 +1,71 @@ +package com.example.owen.weathergo.modules.main.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.owen.weathergo.R; +import com.example.owen.weathergo.modules.dao.CityViewHolder; + +import java.util.ArrayList; + + +/** + * Created by owen on 2017/4/25. + */ + +public class CityAdapter extends RecyclerView.Adapter implements View.OnClickListener { + private Context mContext; + private ArrayList mDataList; + private OnRecyclerViewItemClickListener mOnItemClickListener = null; + + public CityAdapter(Context context, ArrayList dataList) { + Log.i("CityAdapter","con"); + mContext = context; + this.mDataList = dataList; + } + + @Override + public CityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(mContext).inflate(R.layout.city_items,parent,false); + CityViewHolder cvh = new CityViewHolder(view); + view.setOnClickListener(this); + return cvh; + } + + @Override + public void onBindViewHolder(final CityViewHolder holder, final int position) { + + Log.i("CityAdaptergetItem",""+mDataList.get(position)); + holder.bind(mDataList.get(position)); +// holder.mCardView.setOnClickListener(v -> mOnItemClickListener.onItemClick(v, position)); +// holder.mCardView.setOnClickListener(mOnItemClickListener.onItemClick(v,position)); + holder.mCardView.setTag(position); + } + + @Override + public int getItemCount() { + Log.i("CityAdaptergetItem",""+mDataList.size()); + return mDataList.size(); + } + + //绑定recycleView点击事件参考自 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2647.html + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public void onClick(View v) { + if(mOnItemClickListener != null){ + mOnItemClickListener.onItemClick(v,(int)v.getTag()); + } + } + + + public interface OnRecyclerViewItemClickListener { + void onItemClick(View view, int pos); + } +} diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 0000000..2716800 --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/icon_city.xml b/app/src/main/res/drawable/icon_city.xml new file mode 100644 index 0000000..33d2ba8 --- /dev/null +++ b/app/src/main/res/drawable/icon_city.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_choise_city.xml b/app/src/main/res/layout/activity_choise_city.xml new file mode 100644 index 0000000..ccf949d --- /dev/null +++ b/app/src/main/res/layout/activity_choise_city.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/city_items.xml b/app/src/main/res/layout/city_items.xml new file mode 100644 index 0000000..def80e8 --- /dev/null +++ b/app/src/main/res/layout/city_items.xml @@ -0,0 +1,35 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/raw/china_city.db b/app/src/main/res/raw/china_city.db new file mode 100644 index 0000000..4e11872 Binary files /dev/null and b/app/src/main/res/raw/china_city.db differ diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index b01488f..ce46134 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -3,4 +3,5 @@ (such GitHubRepoAdapter screen margins) for screens with more than 820dp of available width. This would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> 64dp + 8dp diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8926d00..4384d5e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,4 +3,5 @@ 16dp 16dp 256dp + 8dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df8fdc6..ee4e0d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -131,5 +131,6 @@ Silent Vibrate + android.support.design.widget.AppBarLayout$ScrollingViewBehavior