这一篇是Everyday关于笑话模块的最后一讲,主要实现三个功能,笑话分享(最简单的调用系统分享方法)&listview优化&获取系统时间。
先看效果图
对比上一篇,我们可以发现程序有了不一样的改变,我们从易到难对这几个改变进行说明
第一部分:获取系统时间并显示在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实体类的:jokeDataList; private LinearLayout linearLayout; //JokeAdapter的构造函数,创建JokeAdapter的时候需要传入数据和上下文对象 public JokeAdapter(Context mContext, List 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(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总结: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 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