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

     这一篇是Everyday关于笑话模块的最后一讲,主要实现三个功能,笑话分享(最简单的调用系统分享方法)&listview优化&获取系统时间。

     先看效果图

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

对比上一篇,我们可以发现程序有了不一样的改变,我们从易到难对这几个改变进行说明

第一部分:获取系统时间并显示在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;ijokeData=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


你可能感兴趣的:(安卓小项目之Everyday)