本篇文章是之前自己做一个练手项目的一个总结,第一次做一个项目,有点笨,但是项目的基本功能都实现了。如有需要看项目如何实现的可以移步GitHub地址:乐呵,或者用魅族手机的朋友可以上魅族应用市场搜索乐呵下载,或者点击我下载
list数据不拼接
在项目中使用的是XRecyclerView,但是有时候数据的拼接,也就是数据的分页显示会不能添加到List集合中,我在项目使用的办法如下:
@Override
public void onResponse(Call<NewsResult> call,Response<NewsResult> response) {
mNewsInfos.addAll(response.body().
getResult().getData());//直接将数据添加到list集合中
mNewsAdapter.notifyDataSetChanged();//记得刷新数据
}
首先先创建一个集合,然后将每次请求网络返回的数据直接添加进入list集合中,这就OK了。项目中用的网络请求框架为Retrofit2.1
Adapter中的holder中的控件不能做全局变量
也许这不算个问题,但是有时候使用AS的时候使用快捷键
Ctrl + Alt + V
后 顺手Ctrl + Alt + F
,然后变量就设置到全局变量中了,这样就会导致你程序运行到这里就会崩溃。所以写代码还是非常小心的,否则就是自己给自己挖坑。
解决WebView有时候显示不出来
不同的导火线就会导致不同的结果,我这里是因为WebView中要加载的URL有时候是http,有时候是https,so我的解决办法如下:
webView.setWebViewClient(new WebViewClient(){
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
//handler.cancel(); 默认的处理方式,WebView变成空白页
handler.proceed(); //接受证书,重要
//handleMessage(Message msg); 其他处理
}
});
this.webView.loadUrl("你的url");
}
在WebView
实例的setWebViewClient
方法中重写onReceivedSslError
方法。然后添加接受证书即可。
ViewPager + fragment使用的小问题
在切换页面时你是否会只加载出第一个页面,而其它页面加载不上了。那么不妨看一下我的方法。
ViewPager + fragment使用中的
getFragmentManager()
,不妨改成getChildFragmentManager()
我在项目中使用
private void setupViewPager() {
mFragments = new ArrayList<>();
for (int i = 0; i < mTitles.length; i++) {
NewsListFragment mNewsListFragment = new NewsListFragment();
Bundle bundle = new Bundle();
bundle.putInt("index", i);//多个页面
mNewsListFragment.setArguments(bundle);
mFragments.add(mNewsListFragment);
}
// 第二步:为ViewPager设置适配器
BaseFragmentAdapter adapter =
new BaseFragmentAdapter(getChildFragmentManager(), mFragments, mTitles);
mViewPager.setAdapter(adapter);
mViewPager.setOffscreenPageLimit(1);// 设置缓存页面,当前页面的相邻N各页面都会被缓存
// 第三步:将ViewPager与TableLayout 绑定在一起
mTabLayout.setupWithViewPager(mViewPager);
}
引用Bmob后端云后打包导致包冲突
引用Bmob后端云后打包导致包(Gson,retrofit:2.1.0,OkHttp)冲突的的解决办法
compile ('com.squareup.retrofit2:converter-gson:2.1.0'){
exclude group: 'com.google.code.gson'//去除这个jar包的引用,以下同理
exclude group: 'com.squareup.okhttp3' }
compile ('com.squareup.retrofit2:retrofit:2.1.0'){
exclude group: 'com.squareup.okhttp3' }
解释:
exclude group: 'com.google.code.gson'
//去除这个jar包的引用,以下同理;
'com.google.code.gson'
,可以去冲突的jar包下的META-IN下的仓库文件夹下打开找到 pom.xml
文件,然后打开该文件找到<dependecy>
节点下的<groupId>
节点中的内容就是咱们需要的内容
推荐2个小工具
- 时间转换工具
将时间转换为时间戳,比如新闻几小时前发布; 原文地址
public class DateUtils {
/**
* 掉此方法输入所要转换的时间输入例如("2014年06月14日16时09分00秒")返回时间戳
*
* @param time
* @return
*/
public static String data(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒",
Locale.CHINA);
Date date;
String times = null;
try {
date = sdr.parse(time);
long l = date.getTime();
String stf = String.valueOf(l);
times = stf.substring(0, 10);
Log.d("--444444---", times);
} catch (ParseException e) {
e.printStackTrace();
}
return times;
}
/**
* 掉此方法输入所要转换的时间输入例如("2014-06-14 17:19")返回时间戳
*
* @param time
* @return
*/
public static String dataOne(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm",
Locale.CHINA);
Date date;
String times = null;
try {
date = sdr.parse(time);
long l = date.getTime();
String stf = String.valueOf(l);
times = stf.substring(0, 10);
Log.d("--444444---", times);
} catch (ParseException e) {
e.printStackTrace();
}
return times;
}
/**
* 掉此方法输入所要转换的时间输入例如("2014-06-14-16-09-00")返回时间戳
*
* @param time
* @return
*/
public static String dataTwo(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd",
Locale.CHINA);
Date date;
String times = null;
try {
date = sdr.parse(time);
long l = date.getTime();
String stf = String.valueOf(l);
times = stf.substring(0, 10);
Log.d("--444444---", times);
} catch (ParseException e) {
e.printStackTrace();
}
return times;
}
/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014年06月14日16时09分00秒")
*
* @param time
* @return
*/
public static String times(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;
}
/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014年06月14日16时09分")
*
* @param time
* @return
*/
public String timet(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;
}
// 并用分割符把时间分成时间数组
/**
* 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014-06-14-16-09-00")
*
* @param time
* @return
*/
public String timesOne(String time) {
SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
@SuppressWarnings("unused")
long lcc = Long.valueOf(time);
int i = Integer.parseInt(time);
String times = sdr.format(new Date(i * 1000L));
return times;
}
/**
* 根据传递的类型格式化时间
*
* @param str
* @param type 例如:yy-MM-dd
* @return
*/
public String getDateTimeByMillisecond(String str, String type) {
Date date = new Date(Long.valueOf(str));
SimpleDateFormat format = new SimpleDateFormat(type);
String time = format.format(date);
return time;
}
/**
* 将时间戳转为代表"距现在多久之前"的字符串
* @param timeStr 时间戳
* @return
*/
public static String getStandardDate(String timeStr) {
StringBuffer sb = new StringBuffer();
long t = Long.parseLong(timeStr);
long time = System.currentTimeMillis() - (t*1000);
long mill = (long) Math.ceil(time /1000);//秒前
long minute = (long) Math.ceil(time/60/1000.0f);// 分钟前
long hour = (long) Math.ceil(time/60/60/1000.0f);// 小时
long day = (long) Math.ceil(time/24/60/60/1000.0f);// 天前
if (day - 1 > 0) {
sb.append(day + "天");
} else if (hour - 1 > 0) {
if (hour >= 24) {
sb.append("1天");
} else {
sb.append(hour + "小时");
}
} else if (minute - 1 > 0) {
if (minute == 60) {
sb.append("1小时");
} else {
sb.append(minute + "分钟");
}
} else if (mill - 1 > 0) {
if (mill == 60) {
sb.append("1分钟");
} else {
sb.append(mill + "秒");
}
} else {
sb.append("刚刚");
}
if (!sb.toString().equals("刚刚")) {
sb.append("前");
}
return sb.toString();
}
/**
* 获取当前时间
*
* @return
*/
public static String getCurrentTime() {
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return sdf.format(new java.util.Date());
}
}
- 应用推广工具
这是 吴小龙同学大神写的,挺不错的。
public class InviteCommentUtil {
private String mDateFormat = "yyyy-MM-dd";
private String mInviteCommentTime;
/**
* 选择哪天弹邀请评论框
*/
public void startComment(final Activity activity) {
mInviteCommentTime = PreferenceUtils.getPreferenceString(activity, "inviteCommentTime", TimeUtil.getCurrentTime(mDateFormat));
String saveCommentTime = PreferenceUtils.getPreferenceString(activity, "saveCommentTime", TimeUtil.getCurrentTime(mDateFormat));
int compareDateValue = TimeUtil.compareDate(mInviteCommentTime, saveCommentTime, mDateFormat);
if (compareDateValue == 1) {
AlertDialog.Builder builder = new AlertDialog.Builder(
activity);
int nowReadingTotal = ReadUtil.getReadedTotal();
builder.setMessage(Html.fromHtml("您已经累计阅读<font color=#FF0000>" + nowReadingTotal + "</font>字,再接再厉哦!如果喜欢我,希望您能在应用市场给予<font color=#FF0000>五星</font>好评!"));
builder.setTitle("求好评");
builder.setPositiveButton("好评鼓励",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setComment(activity);
try {
Intent intent = new Intent(
"android.intent.action.VIEW");
intent.setData(Uri
.parse("market://details?id=com.android.xiaomolongstudio.weiyan"));
activity.startActivity(intent);
activity.overridePendingTransition(
R.anim.enter_right_to_left, R.anim.exit);
} catch (Exception e) {
e.printStackTrace();
}
dialog.dismiss();
}
});
builder.setNegativeButton("下次再说",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setComment(activity);
dialog.dismiss();
}
});
builder.create().show();
}
}
/**
* 保存,直到下周再提示
*/
private void setComment(Activity activity) {
PreferenceUtils.setPreferenceString(activity, "saveCommentTime", mInviteCommentTime);
}
}
安利一下我的项目
有能力的朋友帮忙点个star,多谢了!
学点英语
Life is a maze and love is a riddle.
生活是座迷宫,爱情是个谜。