项目实战:DbUtils查询保存、重用适配器、popuwindow窗口弹出的ListView实现收藏功能

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);//添加到适配器

收藏即是保存到本地中很少有应用会同步到服务器。如QQ收藏图片就是在本地。

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());//相对于某个控件的位置

	}
	// ------------------------------------------------------------------
}





你可能感兴趣的:(项目实战:DbUtils查询保存、重用适配器、popuwindow窗口弹出的ListView实现收藏功能)