简单图片查看器的实现

app简介

这是一款基于eclipse编辑的简单图片查看器,包含异步下载网络资源、listView的显示、sqlite数据操作等的一些简单的功能;主要操作:点击添加按钮,弹出对话框,向对话框中添加正确图片资源网址以及自定义标题名,就可开启异步线程下载文件,下载后保存在到本地的同时将文件目录名以及自定义的标题名、网址等信息会自定保存到数据库中,并在ListView中自动显示相关数据;在ListView控件长按可以弹出对话判断是否删除文件或者可点击删除按钮将ListView的item删除,同时也会删除数据库的数据;关于图片的文件的删除,删除数据库时会判断有没有其他标题在引用该图片,如果没有则删除…

如果需要完整代码请点击这里


运行效果

由网络中下载的图片
添加图片


功能介绍
1. 自定义简单的布局、按钮图形设计
2. BaseAdapter 自定义适配器的简单实现
3. ListView、Button 等控件事件的实现
4. AsyncTask 异步下载网络图片并保存到本地中
5. AlertdDialog、ProgressDialog等对话的框的实现
6. ContentProvider、SQLiteOpenhelper数据库相关以及数据库增、删、改、差等基本功能的实现
7. 偏好设置、接口回调等其他实现


代码各个模块主要代码的实现

异步代码快+接口回调的实现

从MainActivity中传进网址,


//创建一个外部异步线程
public class MyTask extends AsyncTask<String, Integer, String> {

    String imageName;

    // 接口回调
    interface CallBack {
        // onProgressUpdate方法中使用,参数表示下载图片的大小,这里没有去实现,主要用于开启一个下载的进度对话框
        public void start(int leng);
        // 结束线程的时候调用,用于关闭开启的进度对话框
        public void end();
        // 结束时,船体数据,其实可以跟end()方法一起实现的
        public void getImage_path(String FileName);
    }
    CallBack callBack;
    public MyTask(String imageName, CallBack callBack) {
        this.callBack = callBack;
        this.imageName = imageName + ".jpg";
    }

    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        callBack.end();
        callBack.getImage_path(result);

    }
    // 进度回调
    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
        callBack.start(values[0]);
    }

    // **下载资源文件(异步线程核心代码)**
    protected String doInBackground(String... params) {
        // 开启网路下载
        HttpURLConnection connection = null;
    //获取外部存储路径
        String path = Environment.getExternalStorageDirectory()
                .getAbsolutePath();
        //创建文件对象
        File file = new File(path, imageName);
        // 保存文件到本地种
        try {
    //创建连接
            connection = (HttpURLConnection) new URL(params[0]).openConnection();
            publishProgress(5);
    //创建缓冲输入流,获得网络连接的输入流
            BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
    //创建输出流
BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream(file));
            int len = 0;
    //文件的读写操作
            byte[] buff = new byte[2048];
            while ((len = bis.read(buff)) != -1) {
                bos.write(buff, 0, len);

            }
            bis.close();
            bos.close();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connection.disconnect();
        }
        // 将保存文件的绝对地址返回
        return file.getAbsolutePath().toString();
    }
}
AlertdDialog对话的框的主要代码
// 添加数据..按钮点击事件
    public void addMessage(View v) {
        // Toast.makeText(this, "xxx", 0).show();
        tv_first.setVisibility(View.GONE);
        // 找到自定义的布局文件,转化为view
        View view = LayoutInflater.from(this).inflate(R.layout.dialog, null);
        // 创建一个自定义对话框,判断是否加载图片
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 添加自定义的view
        builder.setView(view);
        Button btn_ok = (Button) view.findViewById(R.id.btn_item_ok);
        Button btn_cancel = (Button) view.findViewById(R.id.btn_item_cancel);
        final EditText et_name = (EditText) view.findViewById(R.id.et_name);
        final EditText et_image = (EditText) view.findViewById(R.id.et_image);
        dialog = builder.create();
        dialog.show();

        // 点击确定
        btn_ok.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                // 判断输入是否为空是否为空,如果为空则报错,并返回重新输入
                if (et_image.getText().toString().equals("")
                        || et_image == null) {
                    et_name.setError("网址不能为空");
                    return;
                }

                if (et_name.getText().toString().equals("") || et_name == null) {
                    et_image.setError("标题不能为空");
                    return;
                }

                // 判断是否需要下载 true为需要下载
                boolean isdown = isDownImage(et_name.getText().toString(),
                        et_image.getText().toString());
                if (isdown) {
                    // 启动异步线程
                    MyTask task = new MyTask(et_name.getText().toString(),
                    // 接口回调
                            new CallBack() {
                                public void getImage_path(String fileName) {
                                    Bean bean = new Bean();
                                    bean.imge_path = fileName;
                                    bean.title = et_name.getText().toString();
                                    data.add(bean);
                                    adapter.notifyDataSetChanged();
                                    // 调用方法 添加到数据库中
                                    insert(et_name.getText().toString(),
                                            bean.imge_path, et_image.getText()
                                                    .toString());
                                }

                                @Override
                                public void start(int leng) {
                                    setDownDialog(5);
                                }

                                @Override
                                public void end() {
                                    closeDialog();

                                }
                            });
                    task.execute(et_image.getText().toString());

                }
                dialog.dismiss();
            }
        });
        // 点击取消,返回
        // ........................................................................
        btn_cancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                dialog.dismiss();
            }
        });
    }
数据库ContentProvider的主要代码
// 数据库添加数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        long id = db.insert(TABLE, null, values);
        Uri uri2 = ContentUris.withAppendedId(uri, id);

        if (id != -1) {
            Log.d("msg", id + "数据插入成功............................");

        } else {
            Log.d("msg", id + "数据插入成功............................");
        }
        return uri2;
    }
    // 数据库删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        int delete = db.delete(TABLE, selection, selectionArgs);
        return 0;
    }

    // 更新数据
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        int update = db.update(TABLE, values, selection, selectionArgs);
        return 0;
    }
程序第一次运行的实—-现偏好设置
// 偏好设置 判断是否为第一次运行
        SharedPreferences sf = getSharedPreferences("fi.txt", MODE_PRIVATE);
        boolean isFirst = sf.getBoolean("isfirst", true);
        // 判断是否为第一次
        if (isFirst) {
            Editor edit = sf.edit();
            edit.putBoolean("isfirst", false);
            edit.commit();

        } else {
            tv_first.setVisibility(View.GONE);

        }
自定义适配器的实现

//获取
public View getView(int position, View convertView, ViewGroup parent) {
        ViewHeler heler;
        if (convertView == null) {
            heler = new ViewHeler();
            convertView = inflater.inflate(R.layout.list_item, null);
            heler.imageView = (ImageView) convertView
                    .findViewById(R.id.iv_image);
            heler.textView = (TextView) convertView.findViewById(R.id.tv_titl);

            convertView.setTag(heler);
        } else {
            heler = (ViewHeler) convertView.getTag();
        }
        heler.textView.setText(list.get(position).title);

        try {
            Log.i("msg", list.get(position).imge_path+"..........................");
            FileInputStream in = new FileInputStream(
                    list.get(position).imge_path);
            heler.imageView.setImageBitmap(BitmapFactory.decodeStream(in));
            in.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return convertView;
    }
        class ViewHeler {

        ImageView imageView;
        TextView textView;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值