Dbutils保存方法save//注意xutils使用保存的是javabean类//使用xutils需要
dbutils.save(models);//保存
Dbutils查询单列,//注意,如果查询的javabean中没有该列,报空针
List<Driay> models = dbutils.findDbModelAll(Selector.from(Driay.class).select("objectId"));
Dbutils查询所有 ,//注意,如果查询的表中列,javaBean中不存在,报空针,需要做判断或者想其它办法解决
findAll = dbutils.findAll(Selector.from(Driay.class));//查询driay类
适配器重用,主要是通过构造方法传入参数的时候定义一个标记做判断
adapter = new XlistViewBaseAdapter(act, findAll,2);//添加到适配器
popuwindow要实现收藏每一条数据,必须得获取到它的唯一标识。这样才能与收藏在数据库中的判断。
这里获取标识的方法是通过setTag将之绑定
// 为popupwindow中的listview绑定position more.setTag(position);//more为图片,将它绑定需要解绑的地方是在more图片的点击事件里
public void onClick(View v) { pos = (Integer) v.getTag();// 解绑获取//pos为全局的int类型变量
然后在ListView的事件里,可以操控了。这里建议将ListView事件用匿名内部类定义在more图片的点击事件里
案例代码:
1,Fragment中查询所有
package com.xdl.fragment; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.lidroid.xutils.DbUtils; import com.lidroid.xutils.db.sqlite.Selector; import com.lidroid.xutils.exception.DbException; import com.xdl.activity.HomeActivity; import com.xdl.adapter.XlistViewBaseAdapter; import com.xdl.base.BaseFragment; import com.xdl.bean.Driay; import com.xdl.bmob.R; import com.xdl.xlistview.XListView; import com.xdl.xlistview.XListView.IXListViewListener; /** * * 用DBXutils * 初始化:在Activity中--在onCreate方法中初始化 * 在Fragment中---在onCreate方法中初始化 * 在BaseAdapter中---在构造方法中初始化 * 注意:1,dbxutils查询只支持javaBean中已经设置了set和get方法的属性。2,是javaBean对象必须有int类型id属性 *1,获取DbUtils对象,create(activity) *2,查询所有用的findAll。。查询一列用的是findDbModelAll(Selector.from(Driay.class).select("objectId")); *3,xutils保存方法是save保存的是一个javaBean对象 */ public class MyCollectFragment extends BaseFragment implements IXListViewListener { private HomeActivity act; private TextView title; private XListView xlv; private ProgressDialog pdDialog; //xutils private DbUtils dbutils; //数据源 private List<Driay> findAll = null; //适配器 private XlistViewBaseAdapter adapter;//重用适配器 @Override public void onAttach(Activity activity) { act = (HomeActivity) activity; super.onAttach(activity); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_mycollect, null); } @Override public void onCreate(Bundle savedInstanceState) { Log.i("zzz", "onCreate"); super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { Log.i("zzz", "onCreateActivity"); dbutils = DbUtils.create(act);//初始化 initDatas(); initview(); initviewOper(); super.onActivityCreated(savedInstanceState); } private void initDatas() {//利用xlisview查询数据库 try { //查询表中所有数据 findAll = dbutils.findAll(Selector.from(Driay.class));//查询driay类 if (findAll.size()==0) { findAll = new ArrayList<Driay>(); } adapter = new XlistViewBaseAdapter(act, findAll,2);//添加到适配器 } catch (DbException e) { toast(act, "查询异常"); e.printStackTrace(); } } private void initviewOper() { title.setText("我的收藏"); xlv.setPullRefreshEnable(false);//关闭下拉刷新 xlv.setPullLoadEnable(false);//开启加载更多 xlv.setAdapter(adapter); xlv.setXListViewListener(this); /** * 事件没有实现。分页 */ } private void initview() { title = (TextView) findviewById(R.id.fragment_mycollect_title); xlv = (XListView) findviewById(R.id.fragment_mycollect_xlistview); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } // ******************************************************************** @Override public void onRefresh() { // TODO Auto-generated method stub } @Override public void onLoadMore() { xlv.setAdapter(adapter); } // ************************************************************ }2,适配器中,逻辑有点复杂,代码臃肿。没有优化
package com.xdl.adapter; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.app.ActionBar.LayoutParams; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.LocationClientOption.LocationMode; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.DistanceUtil; import com.lidroid.xutils.DbUtils; import com.lidroid.xutils.db.sqlite.Selector; import com.lidroid.xutils.db.sqlite.SqlInfo; import com.lidroid.xutils.db.table.DbModel; import com.lidroid.xutils.exception.DbException; import com.xdl.activity.HomeActivity; import com.xdl.activity.SplashActivity; import com.xdl.bean.Driay; import com.xdl.bmob.R; import com.xdl.utils.MyAppliction; /** * XlistView适配器 显示了用户查看日记的信息。 * * 实现了more更多图片的点击事件 * 1,PopupWindow定点式窗口。和Dialog不同的是可以弹出到任何地方。支持自定义。窗口会阻塞线程,对不会不会阻塞窗口 2,设置方法。 3,显示 * * 适配器更新总结 1,通常情况下,当适配器的长度发生变化的时候,我们调用notifiction更新适配器。显示数据用的是setAdapter * 但是在分页查询的情况下,我们除了要记住用户每次查询位置。还需要在配器里定义一个方法,传入我们分页查询的条数, 这样能保证我们的数据不会从头开始看 * * @author Administrator * * xutils框架中dbUtils的使用。 1,导入xutils包 。2,获取dbutils对象。3,在构造方法里初始化 * 为了防止用户不断的点击。我们必须得做一下判断,即查询表中的唯一标识,xutils方法查询列 */ public class XlistViewBaseAdapter extends BaseAdapter implements OnClickListener { /** * 1,数据 2,适配器 */ private HomeActivity act; private List<Driay> datas; private PopupWindow popup; private ListView lv; private int flag = 0; private DbUtils dbutils; private int pos; private int[] imagecolor = { R.drawable.tanhei, R.drawable.tchunlv, R.drawable.tyinyuezi, R.drawable.tzongbu, R.drawable.thua, R.drawable.tqiuhuang, R.drawable.tlanse, R.drawable.tshenhui, R.drawable.tshenlv, R.drawable.tyijing }; public XlistViewBaseAdapter(HomeActivity act, List<Driay> datas) { this.act = act; this.datas = datas; dbutils = DbUtils.create(act);// 初始化dbutils } public XlistViewBaseAdapter(HomeActivity act, List<Driay> datas, int flag) { this.act = act; this.datas = datas; this.flag = flag; dbutils = DbUtils.create(act); } @Override public int getCount() { // if (datas.size()==0) //可以删除 // return 0; // else return datas.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return datas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = act.getLayoutInflater().inflate( R.layout.item_xlistview, null); } // 《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《 TextView text = (TextView) ViewHolder.get(convertView, R.id.item_xlistview_text); TextView time = (TextView) ViewHolder.get(convertView, R.id.item_xlistview_time); TextView location = (TextView) ViewHolder.get(convertView, R.id.item_xlistview_location); // TextView weather = (TextView) ViewHolder.get(convertView, // R.id.item_xlistview_weather); LinearLayout bacagrouds = (LinearLayout) ViewHolder.get(convertView, R.id.item_xlistview_bacagroud); // 重用适配器时,功能不一样的地方就是这个图片弹出的事件,所以判断 ImageView more = (ImageView) ViewHolder.get(convertView, R.id.item_xlistview_more); // 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 // 为popupwindow中的listview绑定position more.setTag(position);//more为更多图片,将它绑定 // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if (flag == 1) { more.setVisibility(View.INVISIBLE); } else { more.setVisibility(View.VISIBLE); // 更多图片的点击事件 more.setOnClickListener(this); } for (int i = 0; i < imagecolor.length; i++) {//设置相同的图片显示 if (datas.get(position).getColor()==i) { // 显示 bacagrouds.setBackgroundResource(imagecolor[i]); } } // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> text.setText(datas.get(position).getText()); text.setTextColor(datas.get(position).getTcolor());// 注意这里是int的值 /** * 布局重用判断方法 */ //因为sqllite数据库有createdAt的方法,而driay类中没有它的set方法所以需要判断,否则空针 if (flag==2) { time.setVisibility(View.INVISIBLE); more.setVisibility(View.INVISIBLE); bacagrouds.setVisibility(View.INVISIBLE); }else{ String[] split = datas.get(position).getCreatedAt().split(" ");// 将时间分割 time.setText(split[0] + "\n" + split[1]); } // weather.setText(datas.get(position).getWeather()); // 获取位置显示。先判断位置不为空的情况下在显示 if (datas.get(position).getLocation() != null) { location.setText(obtainLocation(position));// 自定义方法求位置 } return convertView; } // 获取地理位置。方法公共//地理位置相差多少米,应该有起始位置和终点位置 public CharSequence obtainLocation(int position) { // 当前位置 BDLocation dangQianLocation = MyAppliction.myAppliction.getLocation() .get(MyAppliction.myAppliction.getLocation().size() - 1); // 发表信息的位置 BDLocation faBiaoLocation = datas.get(position).getLocation(); // 当前经度和纬度转换成位置 LatLng la_end = new LatLng(dangQianLocation.getLatitude(), dangQianLocation.getLongitude()); // 发表信息的经度和纬度转换成位置 LatLng la_start = new LatLng(faBiaoLocation.getLatitude(), faBiaoLocation.getLongitude()); // 求出位置相差多少米 int distanse = (int) DistanceUtil.getDistance(la_start, la_end); // 转换成公里 if (distanse < 1000) { return distanse + "米"; // 距离误差大小为500米以内 } else { return (distanse + 500) % 1000 + "公里"; } } // 这里是加载数据更新数据的方法 public void butoomUdapter(List<Driay> lists) { // datas.addAll(lists);//添加进去.这样错误。添加的是所以的数据 datas = lists; Log.i("zzz", "传入的butoom方法下标"+lists.get(0).getColor()); } // ------------------------------------------------------------------ /** * 为popuwindow在baseAdapter中的使用 1,popupwindow使用listview的布局,在xml中创建布局,并且引用 * 2,弹出popupwindow内容控制每一条数据的内容 * ,现在baseAdapter的getview方法中用listview绑定position..setTag 3,在listview监听事件中调用即可 */ @SuppressLint("NewApi") @Override public void onClick(View v) { pos = (Integer) v.getTag();// 解绑获取 popup = new PopupWindow();// 实例化popupwindow View v1 = act.getLayoutInflater().inflate( R.layout.xlistview_popupwindowlistview, null); lv = (ListView) v1.findViewById(R.id.xlistview_popupwindowlistview_lv); Drawable background = v.getResources().getDrawable(R.drawable.popup); popup.setBackgroundDrawable(background);// popup.setFocusable(true);// 设置有权利获得焦点 popup.setOutsideTouchable(true);// 当点击非window时自动退出 // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 设置listview监听事件 lv.setOnItemClickListener(new OnItemClickListener() {// 所属包为AdapterView @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position == 1) {//1是收藏选项 try { popup.dismiss();//popupwindow窗口消失隐藏 // 获取日记 Driay shoucang = datas.get(pos); List<DbModel> models = null; //获取数据库中的文件的唯一标识 models = dbutils.findDbModelAll(Selector.from(Driay.class).select("objectId")); int count = 0;//定义变量记录 for (int i = 0; i < models.size(); i++) { //转换成字符串 String str = models.get(i).getString("objectId"); //判断数据库查询出来的是否和用户点击的是否一样,如果一样证明已经存在、、判断是equels if (str.equals(shoucang.getObjectId())) { count++; } } if (models==null) { models = new ArrayList<DbModel>();//如果用户第一次使用程序,预防报空指针。 } // 保存sqlLite数据库 if (count==0) { dbutils.save(shoucang);//保存 Toast.makeText(act, "收藏成功", 0).show(); }else{ Toast.makeText(act, "已经收藏", 0).show(); } } catch (DbException e) { Toast.makeText(act, "保存失败", 0).show(); e.printStackTrace(); } } else { Toast.makeText(act, "没创键呢", 0).show(); } } }); // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> popup.setContentView(v1);// 设置布局 popup.setWidth(200); popup.setHeight(100);// 设置宽和高 int[] location = new int[2]; v.getLocationOnScreen(location); popup.showAtLocation(v,Gravity.NO_GRAVITY, location[0], location[1]-popup.getHeight());//相对于某个控件的位置 } // ------------------------------------------------------------------ }