Android用RecyclerView實現(xiàn)動態(tài)添加本地圖片
本文介紹了Android用RecyclerView實現(xiàn)動態(tài)添加本地圖片,分享給大家,具體如下:
本文所用的多圖選擇的library來自:https://github.com/lovetuzitong/MultiImageSelector
簡單介紹一下用法:
1、跳轉到圖片選擇頁面:
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、通過onActivityResult獲取信息:
final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT); Bitmap bitmap = BitmapFactory.decodeFile(paths.get(0), DIY_dialog.getBitmapOption(4));
首先設置布局管理器為:
recyclerview.setLayoutManager(new GridLayoutManager(this, 3));
然后設置適配器(這里在代碼里面有詳細的注釋):
public class PassengerAdapter extends RecyclerView.Adapter<PassengerAdapter.ViewHolder> {
private Context mContext;
private OnItemClickLitener listener;//點擊事件接口
private ArrayList<String> imageUrls;
private ImageFetcher imageFetcher;
private ViewHolder viewHolder;
private View view;
/**
* 在構造方法中傳入圖片地址的數(shù)據(jù)
* @param context
* @param imageUrls
*/
public PassengerAdapter(Context context, ArrayList<String> imageUrls) {
this.mContext = context;
this.imageUrls = imageUrls;
//初始化加載網(wǎng)絡圖片的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) {
//設置內(nèi)容為“hehe”的的元素為默認的添加按鈕
if (imageUrls.get(position).equals("hehe")) {
holder.imageViewBig.setBackgroundResource(R.mipmap.add);
//當圖片是添加按鈕的時候隱藏刪除按鈕
holder.imageViewSmall.setVisibility(View.GONE);
} else {
holder.imageViewSmall.setVisibility(View.VISIBLE);
/**
* 判斷圖片路徑是網(wǎng)絡地址還是本地圖片
* 設置路徑之中包含“storage”的為本地圖片
*/
if (imageUrls.get(position).contains("storage")) {
try {
File file = new File(imageUrls.get(position));
//將bitmap轉化成drawable
Bitmap bmp = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), Uri.fromFile(file));
Drawable drawable =new BitmapDrawable(bmp);
//按比例擴大圖片的size居中顯示,使得圖片長(寬)等于或大于View的長(寬)
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);
/**
*
* 因為元素是變化的,動態(tài)的,所以對點擊事件的處理放在ViewHolder類里面,調用getposition()
* 可以獲取到當前的元素位子
*/
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和設置點擊事件
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) {
//添加本地相冊圖片,更新視圖
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);
//刪除圖片,更新視圖
}
});
選擇完圖片后,進行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));
//更新第一個位置的圖片
passengerAdapter.notifyItemInserted(0);
}
//修改圖片
else if (requestCode == 10002&&imageUrls.size()>0) {
int pos = poss;
imageUrls.set(pos,paths.get(0));
passengerAdapter.notifyItemChanged(pos);
}
}
}
}
大概就是這樣了,簡單的說一下思路,就是在存儲圖片的list的最后一項添加一個具有不同標識的數(shù)據(jù),當點擊時對應的標識和該標識一致,則添加,反之為修改。使用recylerview可以直接更新有變化的子項,而不用更新全部子項,用戶體驗更好,性能也提高了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android實現(xiàn)動態(tài)改變shape.xml中圖形的顏色
- Android 拍照選擇圖片并上傳功能的實現(xiàn)思路(包含權限動態(tài)獲取)
- Android動態(tài)修改應用圖標與名稱的方法實例
- Android繪制動態(tài)折線圖
- Android GridView擴展仿微信微博發(fā)圖動態(tài)添加刪除圖片功能
- Android動態(tài)繪制餅狀圖的示例代碼
- Android將Glide動態(tài)加載不同大小的圖片切圓角與圓形的方法
- Android 動態(tài)加載二維碼視圖生成快照的示例
- Android實現(xiàn)動態(tài)改變app圖標的示例代碼
- Android自定義view實現(xiàn)動態(tài)柱狀圖
- Android如何實現(xiàn)動態(tài)滾動波形圖(心電圖)功能
相關文章
Android使用RecyclerView實現(xiàn)列表數(shù)據(jù)選擇操作
這篇文章主要為大家詳細介紹了Android使用RecyclerView結合CheckBox實現(xiàn)列表數(shù)據(jù)選擇操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
使用Docker來加速構建Android應用的基本部署思路解析
這篇文章主要介紹了使用Docker來加速構建Android應用的部署思路解析,在服務器中通過Docker鏡像來獲得更高效的開發(fā)和測試流程,需要的朋友可以參考下2016-01-01
Android SharedPreference存儲文件三步走
SharedPreferences是安卓平臺上一個輕量級的存儲類,用來保存應用的一些常用配置,比如Activity狀態(tài),Activity暫停時,將此activity的狀態(tài)保存到SharedPereferences中;當Activity重載,系統(tǒng)回調方法onSaveInstanceState時,再從SharedPreferences中將值取出2023-01-01
解決webview 第二次調用loadUrl頁面不刷新的問題
這篇文章主要介紹了解決webview 第二次調用loadUrl頁面不刷新的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android App中實現(xiàn)簡單的刮刮卡抽獎效果的實例詳解
這篇文章主要介紹了Android App中實現(xiàn)簡單的刮刮卡抽獎效果的實例詳解,文中主要借助Bitmap的canvas.drawPath的api來實現(xiàn),需要的朋友可以參考下2016-03-03
Android 自定義view實現(xiàn)進度條加載效果實例代碼
這篇文章主要介紹了Android 自定義view實現(xiàn)進度條加載效果實例代碼,需要的朋友可以參考下2017-08-08

