Skip to content

Commit b152323

Browse files
committed
fix some bugs and optimize performance
1 parent e850150 commit b152323

22 files changed

+567
-479
lines changed

app/src/main/java/com/waynell/videolist/demo/MainActivity.java

Lines changed: 62 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import android.view.LayoutInflater;
88
import android.view.ViewGroup;
99

10-
import com.waynell.videolist.demo.model.VideoListItem;
11-
import com.waynell.videolist.visibility.calculator.DefaultSingleItemCalculatorCallback;
10+
import com.waynell.videolist.demo.model.VideoItem;
1211
import com.waynell.videolist.visibility.calculator.SingleListViewItemActiveCalculator;
13-
import com.waynell.videolist.visibility.scroll.ItemsPositionGetter;
12+
import com.waynell.videolist.visibility.items.ListItem;
13+
import com.waynell.videolist.visibility.scroll.ItemsProvider;
1414
import com.waynell.videolist.visibility.scroll.RecyclerViewItemPositionGetter;
1515

1616
import java.util.ArrayList;
@@ -26,12 +26,7 @@ public class MainActivity extends AppCompatActivity {
2626

2727
private int mScrollState;
2828

29-
private ItemsPositionGetter mItemsPositionGetter;
30-
31-
private List<VideoListItem> mListItems = new ArrayList<>();
32-
33-
private SingleListViewItemActiveCalculator mCalculator = new SingleListViewItemActiveCalculator(new
34-
DefaultSingleItemCalculatorCallback(), mListItems);
29+
private SingleListViewItemActiveCalculator mCalculator;
3530

3631
private static final String url = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4";
3732

@@ -52,65 +47,94 @@ protected void onCreate(Bundle savedInstanceState) {
5247
setContentView(R.layout.activity_main);
5348
ButterKnife.bind(this);
5449

55-
mListItems.add(new VideoListItem(url, purl1));
56-
mListItems.add(new VideoListItem(url2, purl2));
57-
mListItems.add(new VideoListItem(url3, purl3));
58-
mListItems.add(new VideoListItem(url4, purl4));
59-
mListItems.add(new VideoListItem(url, purl1));
60-
mListItems.add(new VideoListItem(url2, purl2));
61-
mListItems.add(new VideoListItem(url3, purl3));
62-
mListItems.add(new VideoListItem(url4, purl4));
63-
mListItems.add(new VideoListItem(url, purl1));
64-
mListItems.add(new VideoListItem(url2, purl2));
65-
mListItems.add(new VideoListItem(url3, purl3));
66-
mListItems.add(new VideoListItem(url4, purl4));
67-
mListItems.add(new VideoListItem(url, purl1));
68-
mListItems.add(new VideoListItem(url2, purl2));
69-
mListItems.add(new VideoListItem(url3, purl3));
70-
mListItems.add(new VideoListItem(url4, purl4));
71-
mListItems.add(new VideoListItem(url, purl1));
72-
mListItems.add(new VideoListItem(url2, purl2));
73-
mListItems.add(new VideoListItem(url3, purl3));
74-
mListItems.add(new VideoListItem(url4, purl4));
75-
76-
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
50+
final VideoListAdapter adapter = new VideoListAdapter();
51+
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
52+
53+
mCalculator = new SingleListViewItemActiveCalculator(adapter,
54+
new RecyclerViewItemPositionGetter(layoutManager, mRecyclerView));
55+
7756
mRecyclerView.setLayoutManager(layoutManager);
78-
mRecyclerView.setAdapter(new VideoListAdapter());
79-
mItemsPositionGetter = new RecyclerViewItemPositionGetter(layoutManager, mRecyclerView);
57+
mRecyclerView.setAdapter(adapter);
8058
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
8159
@Override
8260
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
8361
mScrollState = newState;
84-
if(newState == RecyclerView.SCROLL_STATE_IDLE && !mListItems.isEmpty()){
85-
mCalculator.onScrollStateIdle(mItemsPositionGetter);
62+
if(newState == RecyclerView.SCROLL_STATE_IDLE && adapter.getItemCount() > 0){
63+
mCalculator.onScrollStateIdle();
8664
}
8765
}
8866

8967
@Override
9068
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
91-
mCalculator.onScrolled(mItemsPositionGetter, mScrollState);
69+
mCalculator.onScrolled(mScrollState);
9270
}
9371
});
9472
}
9573

96-
private class VideoListAdapter extends RecyclerView.Adapter<VideoViewHolder> {
74+
private class VideoListAdapter extends RecyclerView.Adapter<VideoViewHolder> implements ItemsProvider {
75+
76+
private List<VideoItem> mListItems = new ArrayList<>();
77+
78+
public VideoListAdapter() {
79+
generateMockData();
80+
}
81+
82+
private void generateMockData() {
83+
mListItems.add(new VideoItem(url, purl1));
84+
mListItems.add(new VideoItem(url2, purl2));
85+
mListItems.add(new VideoItem(url3, purl3));
86+
mListItems.add(new VideoItem(url4, purl4));
87+
mListItems.add(new VideoItem(url, purl1));
88+
mListItems.add(new VideoItem(url2, purl2));
89+
mListItems.add(new VideoItem(url3, purl3));
90+
mListItems.add(new VideoItem(url4, purl4));
91+
mListItems.add(new VideoItem(url, purl1));
92+
mListItems.add(new VideoItem(url2, purl2));
93+
mListItems.add(new VideoItem(url3, purl3));
94+
mListItems.add(new VideoItem(url4, purl4));
95+
mListItems.add(new VideoItem(url, purl1));
96+
mListItems.add(new VideoItem(url2, purl2));
97+
mListItems.add(new VideoItem(url3, purl3));
98+
mListItems.add(new VideoItem(url4, purl4));
99+
mListItems.add(new VideoItem(url, purl1));
100+
mListItems.add(new VideoItem(url2, purl2));
101+
mListItems.add(new VideoItem(url3, purl3));
102+
mListItems.add(new VideoItem(url4, purl4));
103+
}
97104

98105
@Override
99106
public VideoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
100107
return new VideoViewHolder(LayoutInflater.from(parent.getContext())
101108
.inflate(R.layout.video_list_item, parent, false));
102109
}
103110

111+
public VideoItem getItem(int position) {
112+
return mListItems.get(position);
113+
}
114+
104115
@Override
105116
public void onBindViewHolder(VideoViewHolder holder, int position) {
106-
holder.bind(position, mListItems.get(position));
117+
holder.bind(position, getItem(position));
107118
}
108119

109120
@Override
110121
public int getItemCount() {
111122
return mListItems.size();
112123
}
113124

125+
@Override
126+
public ListItem getListItem(int position) {
127+
RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(position);
128+
if (holder instanceof ListItem) {
129+
return (ListItem) holder;
130+
}
131+
return null;
132+
}
133+
134+
@Override
135+
public int listItemSize() {
136+
return getItemCount();
137+
}
114138
}
115139

116140
}
Lines changed: 145 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,37 @@
11
package com.waynell.videolist.demo;
22

3+
import android.graphics.drawable.ColorDrawable;
4+
import android.media.MediaPlayer;
5+
import android.support.v4.view.ViewCompat;
6+
import android.support.v4.view.ViewPropertyAnimatorListener;
37
import android.support.v7.widget.RecyclerView;
8+
import android.util.Log;
49
import android.view.View;
510
import android.widget.ImageView;
611
import android.widget.TextView;
12+
import android.widget.Toast;
713

814
import com.bumptech.glide.Glide;
915
import com.bumptech.glide.load.engine.DiskCacheStrategy;
1016
import com.bumptech.glide.load.model.GlideUrl;
1117
import com.mikhaellopez.circularprogressbar.CircularProgressBar;
12-
import com.waynell.videolist.demo.model.VideoListItem;
18+
import com.waynell.videolist.demo.model.VideoItem;
19+
import com.waynell.videolist.demo.model.VideoLoadMvpView;
1320
import com.waynell.videolist.demo.target.VideoLoadTarget;
1421
import com.waynell.videolist.demo.target.VideoProgressTarget;
22+
import com.waynell.videolist.visibility.items.ListItem;
1523
import com.waynell.videolist.widget.TextureVideoView;
1624

1725
import java.io.File;
1826
import java.io.InputStream;
1927

2028
import butterknife.Bind;
2129
import butterknife.ButterKnife;
30+
import butterknife.OnClick;
2231

2332

24-
public class VideoViewHolder extends RecyclerView.ViewHolder {
33+
public class VideoViewHolder extends RecyclerView.ViewHolder
34+
implements ListItem, VideoLoadMvpView, ViewPropertyAnimatorListener {
2535

2636
@Bind(R.id.video_view)
2737
public TextureVideoView videoView;
@@ -35,26 +45,155 @@ public class VideoViewHolder extends RecyclerView.ViewHolder {
3545
@Bind(R.id.video_progress)
3646
public CircularProgressBar progressBar;
3747

48+
private int videoState = STATE_IDLE;
49+
private String videoLocalPath;
50+
3851
private final VideoProgressTarget progressTarget;
3952
private final VideoLoadTarget videoTarget;
4053

54+
private static final int STATE_IDLE = 0;
55+
private static final int STATE_ACTIVED = 1;
56+
private static final int STATE_DEACTIVED = 2;
57+
58+
private static final String TAG = "ListItem";
59+
private static final boolean SHOW_LOGS = BuildConfig.DEBUG;
60+
4161
public VideoViewHolder(View view) {
4262
super(view);
4363
ButterKnife.bind(this, view);
44-
videoTarget = new VideoLoadTarget(videoView, videoCover);
64+
65+
videoView.setAlpha(0);
66+
67+
videoTarget = new VideoLoadTarget(this);
4568
progressTarget = new VideoProgressTarget(videoTarget, progressBar);
4669
}
4770

48-
public void bind(int position, VideoListItem item) {
49-
item.bindView(videoView, videoCover);
50-
videoTarget.bind(item);
71+
@OnClick(R.id.video_view)
72+
void cliclVideoView() {
73+
if (!videoView.isHasAudio()) {
74+
Toast.makeText(itemView.getContext(), "video has no sound", Toast.LENGTH_SHORT).show();
75+
return;
76+
}
77+
78+
if (videoView.isMute()) {
79+
videoView.unMute();
80+
Toast.makeText(itemView.getContext(), "turn on video sound", Toast.LENGTH_SHORT).show();
81+
}
82+
else {
83+
videoView.mute();
84+
Toast.makeText(itemView.getContext(), "turn off video sound", Toast.LENGTH_SHORT).show();
85+
}
86+
}
87+
88+
private void reset() {
89+
videoState = STATE_IDLE;
90+
videoView.stop();
91+
videoLocalPath = null;
92+
videoStopped();
93+
}
94+
95+
public void bind(int position, VideoItem item) {
96+
reset();
97+
5198
videoTitle.setText(String.format("Video Position %s", position));
5299
progressTarget.setModel(item.getVideoUrl());
100+
101+
// load video cover photo
102+
Glide.with(itemView.getContext())
103+
.load(item.getCoverUrl())
104+
.placeholder(new ColorDrawable(0xffdcdcdc))
105+
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
106+
.into(videoCover);
107+
108+
// load video file
53109
Glide.with(itemView.getContext())
54110
.using(VideoListGlideModule.getOkHttpUrlLoader(), InputStream.class)
55111
.load(new GlideUrl(item.getVideoUrl()))
56112
.as(File.class)
57113
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
58114
.into(progressTarget);
59115
}
116+
117+
private void cancelAlphaAnimate(View v) {
118+
ViewCompat.animate(v).cancel();
119+
}
120+
121+
private void startAlphaAnimate(View v) {
122+
ViewCompat.animate(v).setListener(this).alpha(0f);
123+
}
124+
125+
@Override
126+
public TextureVideoView getVideoView() {
127+
return videoView;
128+
}
129+
130+
@Override
131+
public void videoBeginning() {
132+
videoView.setAlpha(1.f);
133+
cancelAlphaAnimate(videoCover);
134+
startAlphaAnimate(videoCover);
135+
}
136+
137+
@Override
138+
public void videoStopped() {
139+
cancelAlphaAnimate(videoCover);
140+
videoView.setAlpha(0);
141+
videoCover.setAlpha(1.f);
142+
videoCover.setVisibility(View.VISIBLE);
143+
}
144+
145+
@Override
146+
public void videoPrepared(MediaPlayer player) {
147+
148+
}
149+
150+
@Override
151+
public void videoResourceReady(String videoPath) {
152+
videoLocalPath = videoPath;
153+
if(videoLocalPath != null) {
154+
videoView.setVideoPath(videoPath);
155+
if(videoState == STATE_ACTIVED) {
156+
videoView.start();
157+
}
158+
}
159+
}
160+
161+
@Override
162+
public void setActive(View newActiveView, int newActiveViewPosition) {
163+
if (SHOW_LOGS) {
164+
Log.i(TAG, "setActive " + newActiveViewPosition + " path " + videoLocalPath);
165+
}
166+
167+
videoState = STATE_ACTIVED;
168+
if (videoLocalPath != null) {
169+
videoView.setVideoPath(videoLocalPath);
170+
videoView.start();
171+
}
172+
}
173+
174+
@Override
175+
public void deactivate(View currentView, int position) {
176+
if(SHOW_LOGS) {
177+
Log.w(TAG, "deactivate " + position);
178+
}
179+
180+
videoState = STATE_DEACTIVED;
181+
videoView.stop();
182+
videoStopped();
183+
}
184+
185+
@Override
186+
public void onAnimationStart(View view) {
187+
188+
}
189+
190+
@Override
191+
public void onAnimationEnd(View view) {
192+
view.setVisibility(View.GONE);
193+
}
194+
195+
@Override
196+
public void onAnimationCancel(View view) {
197+
198+
}
60199
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.waynell.videolist.demo.model;
2+
3+
/**
4+
* @author Wayne
5+
*/
6+
public class VideoItem {
7+
private String mVideoUrl;
8+
private String mCoverUrl;
9+
10+
public VideoItem(String videoUrl, String coverUrl) {
11+
mVideoUrl = videoUrl;
12+
mCoverUrl = coverUrl;
13+
}
14+
15+
public String getCoverUrl() {
16+
return mCoverUrl;
17+
}
18+
19+
public String getVideoUrl() {
20+
return mVideoUrl;
21+
}
22+
}

0 commit comments

Comments
 (0)