张钢
2024-09-02 63608b5dca9eebb6fa2cb1a8652b395f1d910c3e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.application.zhangshi_app_android.ui;
 
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.TextView;
 
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
 
import com.android.app_base.base.adapter.BaseRVAdapter;
import com.android.app_base.base.view.BaseActivity;
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.application.zhangshi_app_android.BR;
import com.application.zhangshi_app_android.R;
import com.application.zhangshi_app_android.adapter.ImagePreviewAdapter;
import com.application.zhangshi_app_android.data.DataRepository;
import com.application.zhangshi_app_android.databinding.ImagePreviewActivityBinding;
import com.gyf.immersionbar.BarHide;
import com.gyf.immersionbar.ImmersionBar;
import com.youth.banner.indicator.CircleIndicator;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
/**
 * @author Ljj
 * @date 2023.08.19. 16:53
 * @desc
 */
public final class ImagePreviewActivity extends BaseActivity<ImagePreviewActivityBinding, SimpleViewModel> {
 
    private static final String INTENT_KEY_IN_IMAGE_LIST = "imageList";
    private static final String INTENT_KEY_IN_IMAGE_INDEX = "imageIndex";
 
    public static void start(Context context, String url) {
        ArrayList<String> images = new ArrayList<>(1);
        images.add(url);
        start(context, images);
    }
 
    public static void start(Context context, List<String> urls) {
        start(context, urls, 0);
    }
 
    public static void start(Context context, List<String> urls, int index) {
        if (urls == null || urls.isEmpty()) {
            return;
        }
        Intent intent = new Intent(context, ImagePreviewActivity.class);
        if (urls.size() > 2000) {
            // 请注意:如果传输的数据量过大,会抛出此异常,并且这种异常是不能被捕获的
            // 所以当图片数量过多的时候,我们应当只显示一张,这种一般是手机图片过多导致的
            // 经过测试,传入 3121 张图片集合的时候会抛出此异常,所以保险值应当是 2000
            // android.os.TransactionTooLargeException: data parcel size 521984 bytes
            urls = Collections.singletonList(urls.get(index));
        }
 
        if (urls instanceof ArrayList) {
            intent.putExtra(INTENT_KEY_IN_IMAGE_LIST, (ArrayList<String>) urls);
        } else {
            intent.putExtra(INTENT_KEY_IN_IMAGE_LIST, new ArrayList<>(urls));
        }
        intent.putExtra(INTENT_KEY_IN_IMAGE_INDEX, index);
        if (!(context instanceof Activity)) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        context.startActivity(intent);
    }
 
    private ImagePreviewAdapter mAdapter;
 
 
    @Override
    public int getLayoutId() {
        return R.layout.image_preview_activity;
    }
 
    @Override
    public int getVariableId() {
        return 0;
    }
 
    @Override
    public void initParam() {
 
    }
 
    @Override
    public void initView() {
        mAdapter = new ImagePreviewAdapter(this);
        mAdapter.setOnItemClickListener(new BaseRVAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(RecyclerView recyclerView, View itemView, int position) {
                if (isFinishing() || isDestroyed()) {
                    return;
                }
                // 单击图片退出当前的 Activity
                finish();
            }
        });
        binding.viewPager.setAdapter(mAdapter);
        binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                binding.tvImagePreviewIndicator.setText((position + 1) + "/" + mAdapter.getItemCount());
            }
        });
    }
 
    @Override
    public void initData() {
        ArrayList<String> images = getIntent().getStringArrayListExtra(INTENT_KEY_IN_IMAGE_LIST);
        if (images == null || images.isEmpty()) {
            finish();
            return;
        }
        mAdapter.setData(images);
 
        if (images.size() != 1) {
            binding.tvImagePreviewIndicator.setVisibility(View.VISIBLE);
            int index = getIntent().getIntExtra(INTENT_KEY_IN_IMAGE_INDEX,0);
            if (index < images.size()) {
                binding.viewPager.setCurrentItem(index);
            }
        }
    }
 
    @Override
    public void initLiveDataObserve() {
 
    }
 
    @NonNull
    @Override
    protected ImmersionBar createStatusBarConfig() {
        return super.createStatusBarConfig()
                // 隐藏状态栏和导航栏
                .hideBar(BarHide.FLAG_HIDE_BAR);
    }
 
    @Override
    public boolean isStatusBarDarkFont() {
        return false;
    }
 
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
 
 
}