安卓初体验?

安卓初体验~

其实这并不算是初体验吧,毕竟大三的时候已经玩过android开发了,而且看起来也蛮像回事儿的.

只不过当时搞了NFC,业务逻辑和网络请求.剩下的最重要的界面和界面跳转,都是在鹅厂的望神帮我写的~

第一节课其实我没去

那一节课,据说老师讲了布局文件

然后好像就布置了一个计算器的作业,然后就没什么了.

反正,我就在界面编辑器里面拖控件.然后findViewById,之后给他们做了一些逻辑~

第二节课说是要做SD卡读取图片,并且显示出来

我一想,觉得有点儿难啊,于是就开始查官方文档去了,

整理了一下,获取文件夹的路径,文件夹内文件这些好像都不难.

选择一个内容显示估计也不难,但是如何做一个漂亮的选择页面,可能比较复杂.

我打算用GridView,做一个和相册一样.

Let’s do this

先搞了一个SDCardHelper的类(写iOS时候留下的习惯,各种Helper)

//外部储存是否可写
static public boolean isExternalStorageWritable()
//外部储存是否可读
static public boolean isExternalStorageReadable()
//储存路径
static public String storagePath()
//为GridView用的文件列表
static public List<GridItem> getFileList()

Android的GridView和iOS的UICollectionView好像差不太多

Android的GridView需要的适配器里面需要重写

public int getCount();
public Object getItem(int position);
public long getItemId(int position);
public View getView(int position, View convertView, ViewGroup parent);

iOS的UICollectionView需要实现DataSource协议的

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

这样就可以正常显示一个GridView(UICollectionView)

可是,我要自定义控件呀!不然用原始的GridView中每个item的View或者UICollectionView中原始的UICollectionViewCell
,那得多难看…

在iOS中,只要写一个继承于UICollectionViewCell的类,对它进行界面操作,数据操作,并且在Protocol中复用Cell并且返回,就可以完成目的

在Android中,貌似没有类似UICollectionViewCell的东西.所以得自己重写一个类,用来持有Item的xml布局文件中的各个控件

import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by vikingwarlock on 16-9-23.
 * This is the class for view
 */
public class GridItemView {
    public ImageView imageView;
    public TextView filename;
}

之前的图片列表,也专门写了一个类,用来存放这个数据

import java.io.Serializable;

/**
 * Created by vikingwarlock on 16-9-23.
 * This is a class that represent a grid item
 */
public class GridItem implements Serializable{
    public String filepath;
    public String filename;
}

这里用了一个Serializable,是为了后面Intent传递用的~

最后在Adapter类里面实现View

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    GridItemView item;
    GridItem data = gridItemList.get(position);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.gridviewitem, null);
        item = new GridItemView();
        item.filename = (TextView) convertView.findViewById(R.id.itemName);
        item.imageView = (ImageView) convertView.findViewById(R.id.itemImage);
        convertView.setTag(item);
    } else {
        item = (GridItemView) convertView.getTag();
    }
    ImageLoader.getInstance().displayImage("file://"+data.filepath,item.imageView);
    item.filename.setText(data.filename);
    return convertView;
}

界面就差不多搞定了~

至于点击效果,iOS依然是实现一个Protocol~就可以了

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;

Android需要手动添加

GridView gv = (GridView) findViewById(R.id.gridView);
if (gv != null) {
    gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            GridItem item = datalist.get(position);
            Intent intent=new Intent();
            intent.setClass(SDView.this,MainActivity.class);
            Bundle bundle=new Bundle();
            bundle.putSerializable("result",item);
            intent.putExtras(bundle);
            setResult(2,intent);
            finish();
        }
    });

这里的gv是GridView的意思,不要想歪了.

做了一堆和Bundle有关的事情,主要是为了Intent中可以传递一个对象,而不仅仅是字符串.

setResult()用来传递一个Intent回上一个需要Result的Activity.

finish()就是结束当前Activity.

这个花了我最多时间的东西就这样做完了~

当然啦,后面还遇到了图片显示的问题.比如卡住啊,比如OOM啊~最后借助了universal-image-loader
都解决了!!

最后坐在旁边的同学跟我说,他们的代码,只有几十行.原来老师给的demo中获取图片是这样写的

@Override
public void onClick(View v) {
    Intent intent = new Intent();
    intent.setType("image/*");
    /* 使用Intent.ACTION_GET_CONTENT这个Action */
    intent.setAction(Intent.ACTION_GET_CONTENT);
    /* 取得相片后返回本画面 */
    startActivityForResult(intent, 1);
}

我好生气!说好的操作SD卡呢!

这样的写法,和iOS中的UIImagePickerViewController一样了~

Anyway,至少我学会了自定义控件的GridView,体验了一把OOM,还学习了SDCard的操作

还望各位大大指导我!