Android 的在Fragment中ListView 通过内置数据库动态加载显示
首先肯定要先有一个数据库,这部分比较简单直接附代码啦!
这个是数据库的操作类
public class DatasDAO
{
SQLiteDatabase databases;
public DatasDAO(SQLiteDatabase databases) {
this.databases = databases;
}
//插入
public boolean insertData(Data user){
ContentValues values=new ContentValues(); //key-value---hashmap
//id不能插入,在数据库中是自增长的
values.put("id",user.getId());
values.put("tempa",user.getTempa());
values.put("humi",user.getHumi()); //title是数据库表的字段,不能错
values.put("light",user.getLight());
values.put("time",user.getTime());
//insert into t_notes values(1,"","")
databases.insert("t_datas",null,values); //表名,插入的条件,插入的数据
return true;
}
//删除
public boolean deleteData(String username){
databases.delete("t_datas","id=?",new String[]{username});
return true;
}
//查找
public Data query(String username){ //返回查找的对象记录
//select * ftom t_notes where id=?
Cursor cursor=databases.query("t_datas",null,"id=?",new String[]{username},null,null,null);
Data notes=null;
if(cursor.moveToNext()){
cursor.getString(0);
cursor.getString(1);
cursor.getString(2);
cursor.getString(3);
cursor.getString(4);
notes=new Data(cursor.getInt(0),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4));
}
return notes;
}
public LinkedList<Data> readAll()
{
LinkedList<Data> list=new LinkedList<Data>();
Cursor cursor=databases.rawQuery("select * from t_datas",null);
while(cursor.moveToNext())
{
Data user=new Data();
user.setId(cursor.getInt(0));
user.setTempa(cursor.getString(1));
user.setHumi(cursor.getString(2));
user.setLight(cursor.getString(3));
user.setTime(cursor.getString(4));
list.add(user);
}
return list;
}
public boolean DeleAll(){
databases.execSQL("DELETE FROM t_datas");
return true;
}
}
这个是数据库建立的必要文件MySQLiteDBH.java
public class MySQLiteDBH extends SQLiteOpenHelper {
private String Create_table_SQL="create Table t_datas(id Integer Primary Key,tempa varchar(50),humi varchar(50),light varchar(50),time varchar(100))";
public MySQLiteDBH(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
/*
context: 上下文
name:数据库的名称
factory:游标工厂
version:数据库的版本
*/
}
//这个方法用来建表的,系统自动回调这个方法
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(Create_table_SQL);
}
//这个方法在数据库升级的时候自动回调这个方法
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
还有一个是数据类,这个比较简单所以就不附了!
接下来就是在Layout里面写代码了
这个是data_list_contact.xml的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".DataFragment"
android:id="@+id/swipeRefreshLayout">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">
<ImageButton
android:id="@+id/reset"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/reset"
android:gravity="center_horizontal"/>
<TextView
android:layout_width="90dp"
android:layout_height="15dp"
android:text="全部清除"
android:textSize="11dp"
android:textStyle="italic"
android:textColor="@color/txcolor"
android:gravity="center_horizontal"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#d9dada">
<TextView
android:text="温度"
android:layout_width="65dp"
android:layout_height="wrap_content"
android:textSize="18dp"
android:gravity="center"
android:textStyle="italic"
android:textColor="@color/txcolor"
/>
<TextView
android:text="湿度"
android:layout_width="65dp"
android:layout_height="wrap_content"
android:textSize="18dp"
android:gravity="center"
android:textStyle="italic"
android:textColor="@color/txcolor"/>
<TextView
android:text="光照"
android:layout_width="65dp"
android:layout_height="wrap_content"
android:textSize="18dp"
android:gravity="center"
android:textStyle="italic"
android:textColor="@color/txcolor"/>
<TextView
android:text="时间"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="18dp"
android:textStyle="italic"
android:gravity="center"
android:textColor="@color/txcolor"/>
</LinearLayout>
<ListView
android:id="@+id/listContact"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
附一张这个布局的图片吧,不是很好看
这个是另一个Layout_data_list.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".DataFragment">
<TextView
android:id="@+id/txttemp"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"/>
<TextView
android:id="@+id/txthumi"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"/>
<TextView
android:id="@+id/txtlight"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"/>
<TextView
android:id="@+id/txttime"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"/>
</LinearLayout>
这个Layout是为了给适配器显示的时候的布局。
当然我用是的SimpleAdapter适配器
接下来就是最重要的DataFragment 里面的内容了
@SuppressLint("NewApi")
public class DataFragment extends Fragment {
Date date;
NotificationManager notificationManager;
SimpleAdapter simpleAdapter;
ListView listView;
View rootView;
Button looks;
SQLiteDatabase database;
MySQLiteDBHelper mySQLHelper;
DatasDAO datasDAO;
//是否第一次加载
private boolean isFirstLoading = true;
SwipeRefreshLayout swipeRefreshLayout;
ImageButton imageButton;
/**
* 在fragment可见的时候,刷新数据
*/
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//rootView就是DialFragment
rootView=inflater.inflate(R.layout.data_list_contact,container,false);
notificationManager=(NotificationManager) getActivity().getSystemService(getActivity().NOTIFICATION_SERVICE);
// swipeRefreshLayout = (SwipeRefreshLayout)rootView.findViewById(R.id.swipeRefreshLayout);
// imageButton=getActivity().findViewById(R.id.reset);
mySQLHelper=new MySQLiteDBHelper(rootView.getContext(),"datas_two.db",null,1);
database=mySQLHelper.getWritableDatabase();
datasDAO=new DatasDAO(database);
init();
listView=(ListView)rootView.findViewById(R.id.listContact);
return rootView;
// return super.onCreateView(inflater, container, savedInstanceState);
}
private void init() {
ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (int i = 0; i < datasDAO.readAll().size(); i++) {
//数据存入map
Map<String, String> map = new HashMap<String, String>();
map.put("tempe", datasDAO.readAll().get(i).getTempa());
map.put("humi", datasDAO.readAll().get(i).getHumi());
map.put("light", datasDAO.readAll().get(i).getLight());
map.put("time", datasDAO.readAll().get(i).getTime());
//map添加到集合list中
list.add(map);
}
listView = (ListView) rootView.findViewById(R.id.listContact);
simpleAdapter=new SimpleAdapter(getContext(),list,R.layout.layout_data_list,
new String[]{"tempe","humi","light","time"},new int[]{R.id.txttemp,R.id.txthumi,R.id.txtlight,R.id.txttime});
listView.setAdapter(simpleAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//c从View中取出name和phone
TextView textName=(TextView) view.findViewById(R.id.txttemp);
String nameNew=textName.getText().toString();
TextView textPhone=(TextView) view.findViewById(R.id.txthumi);
String phoneNew= textPhone.getText().toString();
TextView textlight=(TextView) view.findViewById(R.id.txtlight);
String light= textlight.getText().toString();
TextView texttime=(TextView) view.findViewById(R.id.txttime);
String time= texttime.getText().toString();
Intent intent=new Intent(getContext(),DataDetailActivity.class);
intent.putExtra("temp",nameNew);
intent.putExtra("humi",phoneNew);
intent.putExtra("light",light);
intent.putExtra("time",time);
startActivity(intent);
// Toast.makeText(getActivity(), "点击了第"+i+"个。"+"温度:"+nameNew+",湿度:"+phoneNew+",光照:"+light+"\r\n时间:"+time, Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
imageButton=(ImageButton)getActivity().findViewById(R.id.reset);
imageButton.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View v) {
if(datasDAO.DeleAll()) {
MenuActivity menuActivity=(MenuActivity)getActivity();
FragmentManager fragmentManager=menuActivity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.contents,new DataFragment());
Toast.makeText(getContext(), "数据清除成功", Toast.LENGTH_LONG).show();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==10){
MenuActivity menuActivity=(MenuActivity)getActivity();
FragmentManager fragmentManager=menuActivity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.contents,new DataFragment());
fragmentTransaction.commit();
}
}
}
因为我是在Fragment里面动态加载的所以按钮监听以及适配器设置的时候需要getContext()来获取上下文,这里需要注意!!!