安卓小项目之Everyday(4)---分享功能、listview优化、获取系统时间
2017-11-18 09:18
483 查看
这一篇是Everyday关于笑话模块的最后一讲,主要实现三个功能,笑话分享(最简单的调用系统分享方法)&listview优化&获取系统时间。
先看效果图
对比上一篇,我们可以发现程序有了不一样的改变,我们从易到难对这几个改变进行说明
第一部分:获取系统时间并显示在listview中
代码:
这个没什么好说的,使用calander获取类中的属性,在把他拼接成我们需要显示的时间就行了,值得注意的是,我们更新的笑话是一起更新的,所以他们拥有共同的时间,如果我们将之作为类的实例的变量的话,这个实例的每一条子选项都会进行赋值,这样在执行效率上肯定是低下的;所以我们把时间作为实体类的成为,将之设置为static的,在适配器那边直接调用即可,这样只需要给类赋值一次就行了;所有代码会在最后贴出
第二部分:listview的优化
代码:
具体需要讲解的都在注释中写着,对于这样列表项不多的listview,优化只需要进行这两项就满足了
第三部分:分享笑话功能
代码:
这个系统提供的方法,以前学习intent的时候就学过intent分为显示意图和隐式意图,显示意图就是打开的活动是十分明确的,而隐式意图则是打开的活动不明确,只要满足特定的action都可以作为intent打开的对象,这也是实现分享功能的重要基础;值得注意的是,调用上面的函数,系统会默认寻找你手机上面满足的程序,但是样式是固定的(丑),也没有回掉函数,就是说我们分享后不能进行其他操作。如果你觉得这样分享太简陋,你完全可以使用世面上的框架进行分享功能的制作,下面是总代码
适配器的:
实体类的:
活动的(fragment??)的:
总结:
1、到此为止,四个模块完成了一个了,还算不错,就是时间拖得有点久
2、为啥拖得久,完成这部分如果是认真做的话应该是两三天的,那是因为要上班,项目松就写写,否则就没时间咯
3、值得说的一点,我们以前做子项布局的时候,将转发的功能在页面上设置为imageview,后来为了方便,我改成了button,如果有人要写记得改
4、又要开始新的项目,下次更新也不知道在啥时候,seeyou
先看效果图
对比上一篇,我们可以发现程序有了不一样的改变,我们从易到难对这几个改变进行说明
第一部分:获取系统时间并显示在listview中
代码:
//获取系统时间,用在笑话列表中 public String GetData() { //获取类的实例 Calendar c = Calendar.getInstance(); //年 int year = c.get(Calendar.YEAR); //月,值得注意的是,月份是从0开始算的,所以比实际月份少一个月 int month = c.get(Calendar.MONTH)+1; //日 int day = c.get(Calendar.DAY_OF_MONTH); //24小时的时间 int hour=c.get(Calendar.HOUR_OF_DAY); //分钟 int minute=c.get(Calendar.MINUTE); //整合获取的日期数据并返回 String data="更新于"+year + "年" + month + "月" + day + "日"+hour+"点"+minute+"分"; return data; }
这个没什么好说的,使用calander获取类中的属性,在把他拼接成我们需要显示的时间就行了,值得注意的是,我们更新的笑话是一起更新的,所以他们拥有共同的时间,如果我们将之作为类的实例的变量的话,这个实例的每一条子选项都会进行赋值,这样在执行效率上肯定是低下的;所以我们把时间作为实体类的成为,将之设置为static的,在适配器那边直接调用即可,这样只需要给类赋值一次就行了;所有代码会在最后贴出
第二部分:listview的优化
代码:
@Override public View getView(final int position, View convertView, ViewGroup parent) { //创建内部类ViewHolder的实例 ViewHolder holder; /** * 一:listview优化的第一种方式是避免重复加载view,因为每条子选项的view都是一样的,所以我们完全 * 可以在第一个子选项加载完毕时保存其convertView,以后的每一条子选项都可以直接使用我们缓存好的 * convertView,这样就节省了重复创建view的性能消耗 * 二:listview优化的第二种方式是避免重复寻找id,我们的每一个子项都是通过寻找id的方法进赋值的 * 但是仔细想一想,每一个子项的id都是一摸一样的,现在是因为我们程序比较简单,每一个子项只需要寻找 * 两次id,但是对于复杂的子项,加入一条子项需要寻找多个id,而子项又多的话,这对手机无疑是个巨大的考验 * ,所以我们使用view Holder来缓存已经查找过的id,这样极大的增加程序速度 * * */ if(convertView==null) { LayoutInflater layoutInflater= LayoutInflater.from(mContext); linearLayout= (LinearLayout) layoutInflater.inflate(R.layout.item_of_joke,null); holder=new ViewHolder(); holder.tv_joke_content=linearLayout.findViewById(R.id.tv_joke_content); holder.tv_joke_time=linearLayout.findViewById(R.id.tv_joke_time); holder.btn_joke_forward=linearLayout.findViewById(R.id.btn_joke_forward); //设置笑话item的正文 holder.tv_joke_content.setText(jokeDataList.get(position).getContent()); //设置笑话item的时间 holder.tv_joke_time.setText(JokeData.getTime()); holder.btn_joke_forward.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ShareJoke(jokeDataList.get(position).getContent()); } }); //给view设置tag linearLayout.setTag(holder); } else { linearLayout= (LinearLayout) convertView; //获取该视图下的标签,这样就达到了只获取一次id的目的 holder= (ViewHolder) linearLayout.getTag(); //设置笑话item的正文 holder.tv_joke_content.setText(jokeDataList.get(position).getContent()); //设置笑话item的时间 holder.tv_joke_time.setText(JokeData.getTime()); holder.btn_joke_forward.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ShareJoke(jokeDataList.get(position).getContent()); } }); } return linearLayout; }
具体需要讲解的都在注释中写着,对于这样列表项不多的listview,优化只需要进行这两项就满足了
第三部分:分享笑话功能
代码:
//分享笑话(使用系统提供的分享功能) private void ShareJoke(String joke) { Intent sendIntent=new Intent(); //设置动作 sendIntent.setAction(Intent.ACTION_SEND); //规定数据的形式以及内容 sendIntent.putExtra(Intent.EXTRA_TEXT,""+joke); //设置intent种类 sendIntent.setType("text/plain"); //发送隐式意图,打开系统分享选择器 mContext.startActivity(Intent.createChooser(sendIntent,"将这条笑话分享至。。。")); }
这个系统提供的方法,以前学习intent的时候就学过intent分为显示意图和隐式意图,显示意图就是打开的活动是十分明确的,而隐式意图则是打开的活动不明确,只要满足特定的action都可以作为intent打开的对象,这也是实现分享功能的重要基础;值得注意的是,调用上面的函数,系统会默认寻找你手机上面满足的程序,但是样式是固定的(丑),也没有回掉函数,就是说我们分享后不能进行其他操作。如果你觉得这样分享太简陋,你完全可以使用世面上的框架进行分享功能的制作,下面是总代码
适配器的:
package com.everyday.wei.everyday;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
/**
* Created by wei on 2017/10/19.
*/
public class JokeAdapter extends BaseAdapter{
//得到上下文对象
private Context mContext;
//数据源
private List<JokeData> jokeDataList;
private LinearLayout linearLayout;
//JokeAdapter的构造函数,创建JokeAdapter的时候需要传入数据和上下文对象
public JokeAdapter(Context mContext, List<JokeData> jokeDataList)
{
this.mContext=mContext;
this.jokeDataList=jokeDataList;
}
@Override
public int getCount() {
return jokeDataList.size();
}
@Override
public Object getItem(int position) {
return jokeDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override public View getView(final int position, View convertView, ViewGroup parent) { //创建内部类ViewHolder的实例 ViewHolder holder; /** * 一:listview优化的第一种方式是避免重复加载view,因为每条子选项的view都是一样的,所以我们完全 * 可以在第一个子选项加载完毕时保存其convertView,以后的每一条子选项都可以直接使用我们缓存好的 * convertView,这样就节省了重复创建view的性能消耗 * 二:listview优化的第二种方式是避免重复寻找id,我们的每一个子项都是通过寻找id的方法进赋值的 * 但是仔细想一想,每一个子项的id都是一摸一样的,现在是因为我们程序比较简单,每一个子项只需要寻找 * 两次id,但是对于复杂的子项,加入一条子项需要寻找多个id,而子项又多的话,这对手机无疑是个巨大的考验 * ,所以我们使用view Holder来缓存已经查找过的id,这样极大的增加程序速度 * * */ if(convertView==null) { LayoutInflater layoutInflater= LayoutInflater.from(mContext); linearLayout= (LinearLayout) layoutInflater.inflate(R.layout.item_of_joke,null); holder=new ViewHolder(); holder.tv_joke_content=linearLayout.findViewById(R.id.tv_joke_content); holder.tv_joke_time=linearLayout.findViewById(R.id.tv_joke_time); holder.btn_joke_forward=linearLayout.findViewById(R.id.btn_joke_forward); //设置笑话item的正文 holder.tv_joke_content.setText(jokeDataList.get(position).getContent()); //设置笑话item的时间 holder.tv_joke_time.setText(JokeData.getTime()); holder.btn_joke_forward.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ShareJoke(jokeDataList.get(position).getContent()); } }); //给view设置tag linearLayout.setTag(holder); } else { linearLayout= (LinearLayout) convertView; //获取该视图下的标签,这样就达到了只获取一次id的目的 holder= (ViewHolder) linearLayout.getTag(); //设置笑话item的正文 holder.tv_joke_content.setText(jokeDataList.get(position).getContent()); //设置笑话item的时间 holder.tv_joke_time.setText(JokeData.getTime()); holder.btn_joke_forward.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ShareJoke(jokeDataList.get(position).getContent()); } }); } return linearLayout; }
//分享笑话(使用系统提供的分享功能)
private void ShareJoke(String joke)
{
Intent sendIntent=new Intent();
//设置动作
sendIntent.setAction(
dc0e
Intent.ACTION_SEND);
//规定数据的形式以及内容
sendIntent.putExtra(Intent.EXTRA_TEXT,""+joke);
//设置intent种类
sendIntent.setType("text/plain");
//发送隐式意图,打开系统分享选择器
mContext.startActivity(Intent.createChooser(sendIntent,"将这条笑话分享至。。。"));
}
static class ViewHolder
{
//笑话正文
TextView tv_joke_content;
//笑话更新时间
TextView tv_joke_time;
//转发功能
Button btn_joke_forward;
}
}
实体类的:
package com.everyday.wei.everyday; /** * Created by wei on 2017/10/19. */ public class JokeData { private String content; //一次性更新的十条笑话应该是同一时间更新的,所以共享一个时间 private static String time="1"; //子选项的图片按钮是一样的,所以也设置为静态 public static String getTime() { return time; } public static void setTime(String time) { JokeData.time = time; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
活动的(fragment??)的:
package com.everyday.wei.everyday; import android.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Created by wei on 2017/10/10. */ public class Joke extends Fragment implements TransmitHttpData{ private GetHttpData getHttpData; private JokeAdapter jokeAdapter; private List<JokeData> jokeDataList; private JokeData jokeData; private ListView lv_joke; private View view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view=inflater.inflate(R.layout.tab_joke,null); //将数组初始化 jokeDataList=new ArrayList<>(); return view; } @Override public void onStart() { //用于测试写的日期函数是否正确 // Toast.makeText(getActivity().getBaseContext(),""+GetData(),Toast.LENGTH_LONG).show(); Log.d("joke", "joke的onStart执行了 "); super.onStart(); lv_joke= (ListView) getActivity().findViewById(R.id.lv_joke); getHttpData= (GetHttpData) new GetHttpData("http://v.juhe.cn/joke/randJoke.php?key=60fbc4de5e9c94872a10268487583390",this).execute(); jokeAdapter =new JokeAdapter(view.getContext(),jokeDataList); lv_joke.setAdapter(jokeAdapter); } @Override public void GetData(String data) { Log.d("Joke", "从Joke中获取的数据是"+data); try { ParseJson(data); } catch (JSONException e) { e.printStackTrace(); } } public void ParseJson(String json) throws JSONException { //先得到json数据中的json数组 JSONObject obj1=new JSONObject(json); JSONArray result=obj1.getJSONArray("result"); //Log.d("joke", "result的值是 "+result); //其次对json中我们需要的正文进行提取 //给静态变量赋值的时候不要放入循环中 JokeData.setTime(GetData()); //将图片放入类中 for (int i=0;i<result.length();i++) { jokeData=new JokeData(); //得到笑话正文 String content=result.getString(i); JSONObject obj2=new JSONObject(content); String content1=obj2.getString("content"); //将目标信息放入实体类 jokeData.setContent(content1); //将系统时间放入类中 jokeDataList.add(jokeData); //当数据发生改变时 改变listview的界面 jokeAdapter.notifyDataSetChanged(); //long unixtime=obj2.getLong("unixtime"); //Log.d("Joke", "content: "+content1+"/n unixtime:"+unixtime); //Log.d("Joke", "content: "+content); } } //获取系统时间,用在笑话列表中 public String GetData() { //获取类的实例 Calendar c = Calendar.getInstance(); //年 int year = c.get(Calendar.YEAR); //月,值得注意的是,月份是从0开始算的,所以比实际月份少一个月 int month = c.get(Calendar.MONTH)+1; //日 int day = c.get(Calendar.DAY_OF_MONTH); //24小时的时间 int hour=c.get(Calendar.HOUR_OF_DAY); //分钟 int minute=c.get(Calendar.MINUTE); //整合获取的日期数据并返回 String data="更新于"+year + "年" + month + "月" + day + "日"+hour+"点"+minute+"分"; return data; } }
总结:
1、到此为止,四个模块完成了一个了,还算不错,就是时间拖得有点久
2、为啥拖得久,完成这部分如果是认真做的话应该是两三天的,那是因为要上班,项目松就写写,否则就没时间咯
3、值得说的一点,我们以前做子项布局的时候,将转发的功能在页面上设置为imageview,后来为了方便,我改成了button,如果有人要写记得改
4、又要开始新的项目,下次更新也不知道在啥时候,seeyou
相关文章推荐
- JavaWeb毕业设计项目-足球队管理系统(三)功能优化+项目部署
- 安卓获取系统当前时间
- 安卓调用系统分享功能
- 分享java程序设计中一个小程序:获取当前系统日期和时间在小程序中显示出来
- 获取安卓系统时间
- java System 常用功能(获取时间,获取系统属性)
- php项目有负载,$_SERVER['HTTP_X_FORWARDED_FOR']函数在不同系统中获取到的值形式不一样,ios系统苹果手机只能获取到一个ip(113.87.214.xxx),而安卓手机获取到的是2个ip中间逗号隔开的形式(113.87.214.xxx , xxx.xxx.xxx.xxx)
- 安卓简单开发-获取系统时间
- ios项目有关的系统 uuid,系统版本号,手机型号,获取当前时间……
- 怎样加快电脑开机时间 15条优化电脑系统开机速度的技巧分享
- 关于安卓开始实现最简单地获取系统时间
- 做一个获取系统当前时间接口,优化高并发
- 安卓系统的日历开发(项目报告1)【项目开发需求及功能介绍】
- 安卓获取系统当前时间
- 安卓系统自带分享(发送文本、图片)功能
- ASP.NET如何获取系统时间和数据功能调用
- 安卓小项目之Everyday(3)--将笑话数据显示listview中
- 调用安卓手机系统的分享功能
- 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器
- 调用安卓手机系统的分享功能