我用的例子利用Bmob云服务器实现了让用户上传待出售商品信息,以及能浏览在售商品信息的小功能。刚接触Bmob感觉它确实好用,但我不得不吐槽那个案例更新的太慢了,新版本的SDK跟老版本还是有很大差别的,建议更新SDK的同时也更新一下案例。再就是文档写的不怎么详细。好了,废话不多说,先看一下我的效果图:
其中,主要问题就是用户数据上传和数据的下载显示在屏幕上。
注意啦:
在这里我用的是Bmob目前最新的android SDK版本,这个配置也泼烦的很,新版本和旧版本有很多方法有很大差异,如果大家用的不是我的这个版本的请先看一下这个SDK版本的具体配置方法http://blog.csdn.net/flx413/article/details/52475766 我就是按照这个来的!
一:用户数据上传的实现:
<span style="font-size:18px;"><span style="font-size:14px;">goods_add.setOnClickListener(new View.OnClickListener() {<span style="white-space:pre"> </span>//"上架"按钮的监听事件
@Override
public void onClick(View v) {
final String name, desc, icon_path;
final double price;
name = goods_name.getText().toString();
desc = goods_desc.getText().toString();
price = Double.parseDouble(goods_price.getText().toString());//得到浮点数
//获取文件路径
//icon_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/1.jpg";
icon_path = imagePath;
System.out.println(imagePath);
final BmobFile bmobfile = new BmobFile(new File(icon_path));
bmobfile.upload(new UploadFileListener() {
@Override
public void done(BmobException e) {
if (e == null) {<span style="white-space:pre"> </span>//为空说明没有异常
System.out.println("图片上传成功");
Goods goods = new Goods();
goods.setName(name);
goods.setDesc(desc);
goods.setPrice(price);
goods.setIcon(bmobfile);
goods.save(new SaveListener<String>() {
@Override
public void done(String s, BmobException e) {
if (e == null) {
Toast.makeText(AddActivity.this, "添加数据成功,:", Toast.LENGTH_SHORT).show();
System.out.println("添加数据成功");
} else {
Toast.makeText(AddActivity.this, "添加数据失败", Toast.LENGTH_SHORT).show();
System.out.println("添加数据失败");
}
}
});
} else {
Toast.makeText(AddActivity.this, "文件上传失败", Toast.LENGTH_SHORT).show();
System.out.println("文件上传失败");
}
}
});
finish();
}
});
}</span></span>
由于我的程序中设定用那个户上传的商品信息包括商品图片(BmobFile)、商品名称和描述(String)、商品价格(double),所以我先上传图片,通过取得的图片路径上传,用的是Bmob SDK中的upload()方法。文件上传成功后再上传商品的其他信息,调用sava()方法。上传之后能在表里面看到你上传的内容
二:数据查询和显示功能的实现
<span style="font-size:14px;">//获取数据
private void loadDate() {
BmobQuery<Goods> bmobQuery = new BmobQuery<Goods>();
bmobQuery.findObjects(new FindListener<Goods>() { //按行查询,查到的数据放到List<Goods>的集合
@Override
public void done(List<Goods> list, BmobException e) {
if (e == null){<span style="white-space:pre"> </span>
//System.out.println("查询成功"+list.get(0).getName()+list.get(0).getPrice()+list.get(0).getDesc());
listView.setAdapter(new MyAdapter(GroundActivity.this , list));
}
}
});
}</span>
查询我是按表的行来查询的,调用BmobQuery.findObjects()方法即可以实现,查询的结果是一个List<Object>的
集合,现在已经取得了数据,但是要显示数据还需要写一个适配器(Adapter)将数据放到adapter中显示出来,我在
这个地方走了很多弯路,试了很多中方法,终于还是成功了。下面是我的适配器的代码:
class MyAdapter extends BaseAdapter {
private Context context ;
private List<Goods> list;
public MyAdapter(Context context, List<Goods> list){
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null){
String name;
String desc;
double price;
BmobFile image;
name = list.get(position).getName();
desc = list.get(position).getDesc();
price = list.get(position).getPrice();
image = list.get(position).getIcon();
System.out.println(image.getFileUrl());
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.item_layout, null);//实例化一个布局文件
viewHolder = new ViewHolder();
viewHolder.iv_img = (ImageView)convertView.findViewById(R.id.iv);
viewHolder.tv_name = (TextView)convertView.findViewById(R.id.tv_name);
viewHolder.tv_price = (TextView)convertView.findViewById(R.id.tv_price);
viewHolder.tv_desc = (TextView)convertView.findViewById(R.id.tv_desc);
convertView.setTag(viewHolder);
//不能直接在主线程中进行从网络端获取图片,而需要单独开一个子线程完成从网络端获取图片
new Thread(new Runnable() {
@Override
public void run() {
//根据表中图片的url地址来得到图片(Bitmap类型)
final Bitmap bitmap=getPicture(list.get(position).getIcon().getFileUrl());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
viewHolder.iv_img.post(new Runnable() {
@Override
public void run() {
System.out.println("*********************************");
viewHolder.iv_img.setImageBitmap(bitmap);//将图片放到视图中去
}
});
}
}).start();
viewHolder.tv_name.setText(name);
viewHolder.tv_price.setText(String.valueOf(price)); //将double数据放到textView中
viewHolder.tv_desc.setText(desc);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
class ViewHolder{
ImageView iv_img;
TextView tv_name;
TextView tv_price;
TextView tv_desc;
}
}
我得到图片是
先通过
list.get(position).getIcon().getFileUrl()来得到图
片的url地址,再根据url地址来得到图片,需要注意的是通过url地址获得图片,和将图片放到view
视图中这两个工作需要放到一个子线程里面去,否则就会报错(我也不太了解),通过URL地址来得到
图片的方法如下:
public Bitmap getPicture(String path){
Bitmap bm=null;
try{
URL url=new URL(path);
URLConnection connection=url.openConnection();
connection.connect();
InputStream inputStream=connection.getInputStream();
bm= BitmapFactory.decodeStream(inputStream);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bm;
}
至此基本上就算是大功告成了。希望对大家有帮助。
完整工程下载:链接:http://pan.baidu.com/s/1eSDPL30 密码:uqev
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)