安卓小项目之Everyday(4)---分享功能、listview优化、获取系统时间

来源:互联网 发布:儿童手机编程软件 编辑:程序博客网 时间:2024/06/06 17:00

     这一篇是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的优化

代码:

@Overridepublic 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(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