Android用RecyclerView實(shí)現(xiàn)動(dòng)態(tài)添加本地圖片
本文介紹了Android用RecyclerView實(shí)現(xiàn)動(dòng)態(tài)添加本地圖片,分享給大家,具體如下:
本文所用的多圖選擇的library來(lái)自:https://github.com/lovetuzitong/MultiImageSelector
簡(jiǎn)單介紹一下用法:
1、跳轉(zhuǎn)到圖片選擇頁(yè)面:
Intent intent = new Intent(PassengerSetActivity.this, MultiImageSelectorActivity.class); intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 9); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE); startActivityForResult(intent, 10001);//10001-->添加
2、通過(guò)onActivityResult獲取信息:
final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT); Bitmap bitmap = BitmapFactory.decodeFile(paths.get(0), DIY_dialog.getBitmapOption(4));
首先設(shè)置布局管理器為:
recyclerview.setLayoutManager(new GridLayoutManager(this, 3));
然后設(shè)置適配器(這里在代碼里面有詳細(xì)的注釋):
public class PassengerAdapter extends RecyclerView.Adapter<PassengerAdapter.ViewHolder> { private Context mContext; private OnItemClickLitener listener;//點(diǎn)擊事件接口 private ArrayList<String> imageUrls; private ImageFetcher imageFetcher; private ViewHolder viewHolder; private View view; /** * 在構(gòu)造方法中傳入圖片地址的數(shù)據(jù) * @param context * @param imageUrls */ public PassengerAdapter(Context context, ArrayList<String> imageUrls) { this.mContext = context; this.imageUrls = imageUrls; //初始化加載網(wǎng)絡(luò)圖片的jar包 imageFetcher = new ImageFetcher(context); imageFetcher.setImageCache(ImageCache.getInstance(context)); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { view = LayoutInflater.from(mContext).inflate(R.layout.lay_passager, null); viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { //設(shè)置內(nèi)容為“hehe”的的元素為默認(rèn)的添加按鈕 if (imageUrls.get(position).equals("hehe")) { holder.imageViewBig.setBackgroundResource(R.mipmap.add); //當(dāng)圖片是添加按鈕的時(shí)候隱藏刪除按鈕 holder.imageViewSmall.setVisibility(View.GONE); } else { holder.imageViewSmall.setVisibility(View.VISIBLE); /** * 判斷圖片路徑是網(wǎng)絡(luò)地址還是本地圖片 * 設(shè)置路徑之中包含“storage”的為本地圖片 */ if (imageUrls.get(position).contains("storage")) { try { File file = new File(imageUrls.get(position)); //將bitmap轉(zhuǎn)化成drawable Bitmap bmp = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), Uri.fromFile(file)); Drawable drawable =new BitmapDrawable(bmp); //按比例擴(kuò)大圖片的size居中顯示,使得圖片長(zhǎng)(寬)等于或大于View的長(zhǎng)(寬) holder.imageViewBig.setScaleType(ImageView.ScaleType.CENTER_CROP); holder.imageViewBig.setImageBitmap(bmp); } catch (IOException e) { e.printStackTrace(); } // holder.imageViewBig.setImageURI(Uri.parse(imageUrls.get(position))); } else { imageFetcher.loadImage(imageUrls.get(position), holder.imageViewBig, R.mipmap.touxiang); } } } @Override public int getItemCount() { return imageUrls.size(); } public void setOnItemClickLitener(OnItemClickLitener listener) { this.listener = listener; } public interface OnItemClickLitener { void onBigClick(int position); void onSmallClick(int position); } class ViewHolder extends RecyclerView.ViewHolder { ImageView imageViewBig, imageViewSmall; public ViewHolder(View itemView) { super(itemView); imageViewBig = (ImageView) itemView.findViewById(R.id.imageViewBig); imageViewSmall = (ImageView) itemView.findViewById(R.id.imageViewSmall); /** * * 因?yàn)樵厥亲兓?,?dòng)態(tài)的,所以對(duì)點(diǎn)擊事件的處理放在ViewHolder類里面,調(diào)用getposition() * 可以獲取到當(dāng)前的元素位子 */ imageViewBig.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = (Integer) v.getTag(); listener.onBigClick(getPosition()); } }); imageViewSmall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = (Integer) v.getTag(); listener.onSmallClick(getPosition()); } }); } } }
recycler的布局文件
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/lay_group" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/imageViewBig" android:layout_width="120dp" android:layout_height="120dp" android:background="@mipmap/background" /> <ImageView android:id="@+id/imageViewSmall" android:layout_width="20dp" android:layout_height="20dp" android:background="@mipmap/del" android:layout_gravity="right"/> </FrameLayout> </FrameLayout>
配置recyclerview和設(shè)置點(diǎn)擊事件
recyclerview = (RecyclerView) findViewById(R.id.recyclerview); recyclerview.setLayoutManager(new GridLayoutManager(this, 3)); if(imageUrls.size()==0){ imageUrls.add("hehe"); } passengerAdapter = new PassengerAdapter(this, imageUrls); recyclerview.setAdapter(passengerAdapter); passengerAdapter.setOnItemClickLitener(new PassengerAdapter.OnItemClickLitener() { @Override public void onBigClick(int position) { Log.d(TAG, "onBigClick: "+passengerAdapter.getItemCount()); Log.d(TAG, "onBigClick: "+position); if (position==imageUrls.size()-1) { //添加本地相冊(cè)圖片,更新視圖 Intent intent = new Intent(PassengerSetActivity.this, MultiImageSelectorActivity.class); intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 9); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE); startActivityForResult(intent, 10001);//10001-->添加 } else { Intent intent = new Intent(PassengerSetActivity.this, MultiImageSelectorActivity.class); intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 9); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE); poss = position; startActivityForResult(intent, 10002);//10002-->修改 //修改圖片,更新視圖 } } @Override public void onSmallClick(int position) { imageUrls.remove(position); passengerAdapter.notifyItemRemoved(position); //刪除圖片,更新視圖 } });
選擇完圖片后,進(jìn)行ui更新的操作
/** * 返回圖片url,并上傳七牛 * * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null){ if (requestCode == 10001 || requestCode == 10002) { final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT); Bitmap bitmap = BitmapFactory.decodeFile(paths.get(0), DIY_dialog.getBitmapOption(4)); //添加圖片 if (requestCode == 10001) { //將添加的圖片放在第一位 imageUrls.add(0,paths.get(0)); //更新第一個(gè)位置的圖片 passengerAdapter.notifyItemInserted(0); } //修改圖片 else if (requestCode == 10002&&imageUrls.size()>0) { int pos = poss; imageUrls.set(pos,paths.get(0)); passengerAdapter.notifyItemChanged(pos); } } } }
大概就是這樣了,簡(jiǎn)單的說(shuō)一下思路,就是在存儲(chǔ)圖片的list的最后一項(xiàng)添加一個(gè)具有不同標(biāo)識(shí)的數(shù)據(jù),當(dāng)點(diǎn)擊時(shí)對(duì)應(yīng)的標(biāo)識(shí)和該標(biāo)識(shí)一致,則添加,反之為修改。使用recylerview可以直接更新有變化的子項(xiàng),而不用更新全部子項(xiàng),用戶體驗(yàn)更好,性能也提高了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)動(dòng)態(tài)改變shape.xml中圖形的顏色
- Android 拍照選擇圖片并上傳功能的實(shí)現(xiàn)思路(包含權(quán)限動(dòng)態(tài)獲取)
- Android動(dòng)態(tài)修改應(yīng)用圖標(biāo)與名稱的方法實(shí)例
- Android繪制動(dòng)態(tài)折線圖
- Android GridView擴(kuò)展仿微信微博發(fā)圖動(dòng)態(tài)添加刪除圖片功能
- Android動(dòng)態(tài)繪制餅狀圖的示例代碼
- Android將Glide動(dòng)態(tài)加載不同大小的圖片切圓角與圓形的方法
- Android 動(dòng)態(tài)加載二維碼視圖生成快照的示例
- Android實(shí)現(xiàn)動(dòng)態(tài)改變app圖標(biāo)的示例代碼
- Android自定義view實(shí)現(xiàn)動(dòng)態(tài)柱狀圖
- Android如何實(shí)現(xiàn)動(dòng)態(tài)滾動(dòng)波形圖(心電圖)功能
相關(guān)文章
Android使用RecyclerView實(shí)現(xiàn)列表數(shù)據(jù)選擇操作
這篇文章主要為大家詳細(xì)介紹了Android使用RecyclerView結(jié)合CheckBox實(shí)現(xiàn)列表數(shù)據(jù)選擇操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06使用Docker來(lái)加速構(gòu)建Android應(yīng)用的基本部署思路解析
這篇文章主要介紹了使用Docker來(lái)加速構(gòu)建Android應(yīng)用的部署思路解析,在服務(wù)器中通過(guò)Docker鏡像來(lái)獲得更高效的開發(fā)和測(cè)試流程,需要的朋友可以參考下2016-01-01Android編程實(shí)現(xiàn)播放音頻的方法示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)播放音頻的方法,結(jié)合實(shí)例形式分析了Android使用MediaPlayer類播放音頻的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android音樂(lè)播放器制作 加入控制臺(tái)(三)
這篇文章主要為大家詳細(xì)介紹了Android音樂(lè)播放器的制作方法,如何加入控制臺(tái),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Android SharedPreference存儲(chǔ)文件三步走
SharedPreferences是安卓平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類,用來(lái)保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時(shí),將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時(shí),再?gòu)腟haredPreferences中將值取出2023-01-01解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問(wèn)題
這篇文章主要介紹了解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android Surfaceview的繪制與應(yīng)用
這篇文章主要介紹了Android Surfaceview的繪制與應(yīng)用的相關(guān)資料,需要的朋友可以參考下2017-07-07Android App中實(shí)現(xiàn)簡(jiǎn)單的刮刮卡抽獎(jiǎng)效果的實(shí)例詳解
這篇文章主要介紹了Android App中實(shí)現(xiàn)簡(jiǎn)單的刮刮卡抽獎(jiǎng)效果的實(shí)例詳解,文中主要借助Bitmap的canvas.drawPath的api來(lái)實(shí)現(xiàn),需要的朋友可以參考下2016-03-03Android中自定義加載樣式圖片的具體實(shí)現(xiàn)
想實(shí)現(xiàn)下面這張圖中的自定義加載樣式,其實(shí)很簡(jiǎn)單,首先我們需要的布局組件有ProcessBar和TextView,下面是布局文件的代碼2014-04-04Android 自定義view實(shí)現(xiàn)進(jìn)度條加載效果實(shí)例代碼
這篇文章主要介紹了Android 自定義view實(shí)現(xiàn)進(jìn)度條加載效果實(shí)例代碼,需要的朋友可以參考下2017-08-08