本实验在“安卓开发2”实验基础上进行:安卓开发2——碎片Fragment的使用
目录
一、实验内容:
二、实验过程:
三、代码
1、设计一个新闻数据库,包含一个新闻表:
表名:NewsTable
字段名 |
数据类型 |
约束 |
说明 |
nID |
integer |
主键,自增 |
新闻ID |
Title |
text |
|
标题 |
Content |
text |
|
内容 |
Source |
text |
|
来源 |
time |
text |
|
发布时间 |
imageSource | int | 新闻图片的地址来源 |
2、重写SQLiteOpenHelper类,以使第一次加载时能创建数据库及表,并insert几条初始新闻;当ListActivity加载时,读取数据库中的信息,并创建News对象序列并将数据库中的记录写入,其他程序逻辑可不修改。
3、修改新闻列表,以ListView实现,或在Layout中动态生成TextView实现,使得新闻列表可根据数据库中新闻条数多少而增减。
4、使用SharedPreferences保存已看过的新闻ID,下次再进入时,以灰色显示。
1、新建CreateNewDB类继承SQLiteOpenHelper,重写其中的方法。该类用于创建数据库,数据库中包含一张表,表名为NewsTable。
2、在ListActivity活动第一次创建时进行数据库的创建,数据库名为News.db,随后插入三则新闻数据在表中。接着从表中读出新闻数据,利用cursor.getCount()获取新闻条数,再创建相应数目的News[]数组,最后把每条news[i]添加进lstNews中,用于后面自定义适配器。
3、自定义适配器MyAdapter继承ArrayAdapter,该适配器可通过泛型来指定要适配的数据类型(该处数据类型为News),然后将数据直接传递给ListView。往MyAdapter中传入的布局R.layout.news_item为ListView中每一子项的布局。
4、getAlRead()方法的功能为判断新闻是否达到阅读时间,若是,则将新闻ID添加进lstID,并将该lstID中的数据转成以“,”相间的字符串,最后将字符串以SharePreferences的方式进行保存。
changeColor()方法的功能为利用SharePreferences方法读取之前保存的字符串,再利用split()方法获取到已读新闻的ID,最后将已读新闻置灰。这两个方法都在ListActivity的onStart中调用。
下面是程序运行结果:
ListActivity.java
public class ListActivity extends AppCompatActivity {
private CreateNewsDB createNewsDB;
//接收进入和退出DetailActivity的时间
static long ttime1=0;
static long ttime2=0;
//用于记录新闻条数
int count=0;
//用于记录被点击的行号
String number;
ListView listView;
//用于记录被点击的新闻的标题、来源、时间、内容
static String myTitle;
static String mySource;
static String myTime;
static String myContent;
//用于承装浏览过的新闻ID
static List lstID=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
//创建一个“AlRead”文件,现在里面放一个“,”
SharedPreferences.Editor editor = getSharedPreferences("AlRead", MODE_PRIVATE).edit();
editor.putString("data", ",");
editor.apply();
//创建数据库
createNewsDB=new CreateNewsDB(this,"News.db",null,5);
SQLiteDatabase db=createNewsDB.getWritableDatabase();
//插入数据
ContentValues values=new ContentValues();
values.put("Title","写在习近平总书记考察曲阜五周年之际");
values.put("Content","五年前的11月26日,历史的高光时刻聚焦在孔子故里——山东曲阜。这一天,习近平总书记来到这里考察," +
"发表重要讲话强调,一个国家、一个民族的强盛,总是以文化兴盛为支撑的,中华民族伟大复兴需要以中华文化发展繁荣为条件。");
values.put("Source","新浪网");
values.put("time","2018/11/25");
values.put("imageSource",R.drawable.xijinping);
db.insert("NewsTable",null,values);
values.clear();
values.put("Title","蔡英文辞去民进党党主席意味着什么?");
values.put("Content","11月24日,台湾举行“九合一”选举。当日晚间传来重磅消息,民进党大败," +
"蔡英文宣布辞去民进党主席职务,以示对该党在台湾地区“九合一”选举中的表现负责。");
values.put("Source","搜狐网");
values.put("time","2018/11/25");
values.put("imageSource",R.drawable.cai);
db.insert("NewsTable",null,values);
values.clear();
values.put("Title","支付宝蚂蚁森林初见雏形,“绿色能量”你贡献了多少?");
values.put("Content","相信许多的小伙伴手机上都是有支付宝的吧,支付宝里面有一个蚂蚁森林,许多的小伙伴都是很喜欢玩蚂蚁森林的," +
"但有一些小伙伴不知道蚂蚁森林主要是干什么的,骑士蚂蚁森林主要就是在沙漠里面种树,而我们在蚂蚁森林这个应用玩游戏,也其实也就是做慈善的。");
values.put("Source","腾讯网");
values.put("time","2018/11/25");
values.put("imageSource",R.drawable.mayun);
db.insert("NewsTable",null,values);
values.clear();
//lstNews用于承载每条新闻
List lstNews=new ArrayList();
//游标查询数据库内容
Cursor cursor=db.query("NewsTable",null,null,null,null,null,null);
//获取总共多少条新闻
count=cursor.getCount();
int i=0;
//新闻数组
final News[] news=new News[count];
if(cursor.moveToFirst())
{
do{
//获取数据值
int id=cursor.getInt(cursor.getColumnIndex("nlID"));
String title=cursor.getString(cursor.getColumnIndex("Title"));
String content=cursor.getString(cursor.getColumnIndex("Content"));
String source=cursor.getString(cursor.getColumnIndex("Source"));
String time=cursor.getString(cursor.getColumnIndex("time"));
int imageSource=cursor.getInt(cursor.getColumnIndex("imageSource"));
//将每组值重组为一则新闻news[i]
news[i]=new News();
news[i].setId(String.valueOf(id));
news[i].setTitle(title);
news[i].setContent(content);
news[i].setSource(source);
news[i].setTime(time);
news[i].setImageSource(imageSource);
//将每条新闻存入lstNews
lstNews.add(news[i]);
i++;
}while(cursor.moveToNext());
}
class MyAdapter extends ArrayAdapter{
//每行新闻的布局
private int resourceId;
public MyAdapter(Context context, int resource, List objects) {
super(context, resource, objects);
resourceId=resource;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获取当前项的实例
News myNew=getItem(position);
//利用convertView缓存提高ListView效率
View view;
if(convertView==convertView)
{
view=LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
}else
{
view=convertView;
}
//获取对应控件实例并赋值
TextView tvTitle1=(TextView) view.findViewById(R.id.news1_title);
tvTitle1.setText(myNew.getTitle());
tvTitle1.setTextColor(Color.BLACK);
TextView tvTitle2=(TextView) view.findViewById(R.id.source1);
tvTitle2.setText("来源:"+myNew.getSource());
TextView tvTitle3=(TextView) view.findViewById(R.id.time1);
tvTitle3.setText("时间:"+myNew.getTime());
ImageView ivTitle=(ImageView) view.findViewById(R.id.imageView);
ivTitle.setImageResource(myNew.getImageSource());
return view;
}
}
//借用适配器ArrayAdapter来将数据传入ListView
MyAdapter adapter=new MyAdapter(ListActivity.this,R.layout.news_item,lstNews);
listView=(ListView) findViewById(R.id.listview_title);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
//用Intent传输数据到DetailActivity
Intent intent = new Intent();
intent.setClassName(ListActivity.this, "com.example.lab.myapplication.DetailActivity");
number= news[position].getId();
intent.putExtra("news_title", news[position].getTitle());
intent.putExtra("source", news[position].getSource());
intent.putExtra("time", news[position].getTime());
intent.putExtra("news_content", news[position].getContent());
startActivityForResult(intent, 1);
}
});
}
private void getAlRead()
{
//达到规定阅读时间,则将新闻ID存入文件
if((ttime2-ttime1)/1000>5 && ttime1!=0) {
SharedPreferences.Editor editor = getSharedPreferences("AlRead", MODE_PRIVATE).edit();
lstID.add(number);
//将已读新闻ID转化为字符串保存
String str = "";
for (int i = 0; i < lstID.size(); i++) {
str += lstID.get(i) + ",";
}
editor.putString("data", str);
editor.apply();
}
}
private void changeColor()
{
//如果文件存在,则将文件内已读新闻置灰
File mml=new File("data/data/com.example.lab.myapplication/shared_prefs","AlRead.xml");
if(mml.exists())
{
SharedPreferences pref=getSharedPreferences("AlRead", MODE_PRIVATE);
String str=pref.getString("data","");
//将字符串以“,”分割为字符数组sstr
String sstr[]=str.split("[,]");
//再将字符数组存入List
List lstAlRead=new ArrayList();
for (int i=0; i
DetailActivity.java
public class DetailActivity extends AppCompatActivity {
long stopTime1=0;
static boolean isIn=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
isIn=true;
//Intent接收数据并显示
Intent intent =getIntent();
TextView title=(TextView) findViewById(R.id.title);
title.setText(intent.getStringExtra("news_title"));
TextView source=(TextView) findViewById(R.id.source);
source.setText("来源:"+intent.getStringExtra("source"));
TextView time=(TextView) findViewById(R.id.time);
time.setText("时间:"+intent.getStringExtra("time"));
TextView content=(TextView) findViewById(R.id.content);
content.setText(intent.getStringExtra("news_content"));
}
@Override
protected void onStart() {
super.onStart();
stopTime1=System.currentTimeMillis();
ListActivity.ttime1=stopTime1;
}
}
CreateNewsDB.java
public class CreateNewsDB extends SQLiteOpenHelper{
public static final String CREATE_NEWS="create table NewsTable(" +
"nlID integer primary key autoincrement," +
"Title text," +
"Content text" +
",Source text," +
"time text," +
"imageSource int)";
private Context mContex;
public CreateNewsDB(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
//若相同名字的数据库已经存在则先删除
if(getDatabaseName()==name)
{
context.deleteDatabase(name);
}
mContex=context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_NEWS);
Toast.makeText(mContex,"create succeeded",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists NewsTable");
onCreate(db);
}
}
News.java
public class News {
public String id;
public String title;
public String content;
public String Source;
public String Time;
public int imageSource;
public int getImageSource() {
return imageSource;
}
public void setImageSource(int imageSource) {
this.imageSource = imageSource;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSource() {
return Source;
}
public void setSource(String source) {
Source = source;
}
public String getTime() {
return Time;
}
public void setTime(String time) {
Time = time;
}
}