您的位置:首页 > 其它

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

2017-11-18 09:18 483 查看
     这一篇是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<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐