Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a4a8da1

Browse files
Remove stray override annotation
1 parent 5273ef2 commit a4a8da1

File tree

1 file changed

+101
-50
lines changed

1 file changed

+101
-50
lines changed

‎app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/android/AndroidStudioFragment.java‎

Lines changed: 101 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@
1919
import androidx.annotation.NonNull;
2020
import androidx.annotation.Nullable;
2121
import androidx.appcompat.widget.SearchView;
22+
import androidx.core.view.MenuHost;
23+
import androidx.core.view.MenuProvider;
2224
import androidx.fragment.app.Fragment;
25+
import androidx.lifecycle.Lifecycle;
26+
import androidx.recyclerview.widget.DiffUtil;
2327
import androidx.recyclerview.widget.LinearLayoutManager;
2428
import androidx.recyclerview.widget.RecyclerView;
2529

@@ -41,6 +45,7 @@
4145
import java.util.Collections;
4246
import java.util.HashSet;
4347
import java.util.List;
48+
import java.util.Objects;
4449
import java.util.Random;
4550
import java.util.Set;
4651

@@ -54,7 +59,6 @@ public class AndroidStudioFragment extends Fragment {
5459
@Override
5560
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
5661
@Nullable Bundle savedInstanceState) {
57-
setHasOptionsMenu(true);
5862
return inflater.inflate(R.layout.fragment_android_studio, container, false);
5963
}
6064

@@ -70,6 +74,49 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
7074
allItems.clear();
7175
allItems.addAll(loadItems());
7276
populateAdapter(allItems);
77+
78+
MenuHost menuHost = requireActivity();
79+
menuHost.addMenuProvider(new MenuProvider() {
80+
@Override
81+
public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
82+
menuInflater.inflate(R.menu.menu_android_studio, menu);
83+
MenuItem searchItem = menu.findItem(R.id.action_search);
84+
SearchView searchView = (SearchView) searchItem.getActionView();
85+
if (searchView != null) {
86+
searchView.setQueryHint(getString(R.string.search_lessons_hint));
87+
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
88+
@Override
89+
public boolean onQueryTextSubmit(String query) {
90+
filterLessons(query);
91+
return true;
92+
}
93+
94+
@Override
95+
public boolean onQueryTextChange(String newText) {
96+
filterLessons(newText);
97+
return true;
98+
}
99+
});
100+
}
101+
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
102+
@Override
103+
public boolean onMenuItemActionExpand(@NonNull MenuItem item) {
104+
return true;
105+
}
106+
107+
@Override
108+
public boolean onMenuItemActionCollapse(@NonNull MenuItem item) {
109+
filterLessons("");
110+
return true;
111+
}
112+
});
113+
}
114+
115+
@Override
116+
public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
117+
return false;
118+
}
119+
}, getViewLifecycleOwner(), Lifecycle.State.RESUMED);
73120
}
74121

75122
private void ensureMobileAdsInitialized() {
@@ -81,8 +128,7 @@ private void ensureMobileAdsInitialized() {
81128

82129
private List<Object> loadItems() {
83130
List<Object> items = new ArrayList<>();
84-
XmlResourceParser parser = getResources().getXml(R.xml.preferences_android_studio);
85-
try {
131+
try (XmlResourceParser parser = getResources().getXml(R.xml.preferences_android_studio)) {
86132
int event = parser.getEventType();
87133
Lesson currentLesson = null;
88134
while (event != XmlPullParser.END_DOCUMENT) {
@@ -124,8 +170,6 @@ private List<Object> loadItems() {
124170
event = parser.next();
125171
}
126172
} catch (XmlPullParserException | IOException ignored) {
127-
} finally {
128-
parser.close();
129173
}
130174
return items;
131175
}
@@ -167,40 +211,6 @@ private void populateAdapter(List<Object> source) {
167211
adapter.setItems(items);
168212
}
169213

170-
@Override
171-
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
172-
super.onCreateOptionsMenu(menu, inflater);
173-
inflater.inflate(R.menu.menu_android_studio, menu);
174-
MenuItem searchItem = menu.findItem(R.id.action_search);
175-
SearchView searchView = (SearchView) searchItem.getActionView();
176-
searchView.setQueryHint(getString(R.string.search_lessons_hint));
177-
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
178-
@Override
179-
public boolean onQueryTextSubmit(String query) {
180-
filterLessons(query);
181-
return true;
182-
}
183-
184-
@Override
185-
public boolean onQueryTextChange(String newText) {
186-
filterLessons(newText);
187-
return true;
188-
}
189-
});
190-
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
191-
@Override
192-
public boolean onMenuItemActionExpand(MenuItem item) {
193-
return true;
194-
}
195-
196-
@Override
197-
public boolean onMenuItemActionCollapse(MenuItem item) {
198-
filterLessons("");
199-
return true;
200-
}
201-
});
202-
}
203-
204214
private void filterLessons(String query) {
205215
String lower = query == null ? "" : query.toLowerCase();
206216
if (lower.isEmpty()) {
@@ -214,8 +224,7 @@ private void filterLessons(String query) {
214224
if (item instanceof Category) {
215225
lastCategory = (Category) item;
216226
categoryAdded = false;
217-
} else if (item instanceof Lesson) {
218-
Lesson l = (Lesson) item;
227+
} else if (item instanceof Lesson l) {
219228
if (l.title != null && l.title.toLowerCase().contains(lower)) {
220229
if (lastCategory != null && !categoryAdded) {
221230
filtered.add(lastCategory);
@@ -253,11 +262,11 @@ private static class LessonAdSpacingDecoration extends RecyclerView.ItemDecorati
253262
@Override
254263
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
255264
@NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
256-
RecyclerView.Adapter<?> adapter = parent.getAdapter();
257-
if (!(adapter instanceofLessonsAdapter)) return;
265+
LessonsAdapter adapter = (LessonsAdapter) parent.getAdapter();
266+
if (adapter == null) return;
258267
int position = parent.getChildAdapterPosition(view);
259268
if (position == RecyclerView.NO_POSITION) return;
260-
int type = ((LessonsAdapter) adapter).getItemViewType(position);
269+
int type = adapter.getItemViewType(position);
261270
if (type == LessonsAdapter.TYPE_LESSON || type == LessonsAdapter.TYPE_AD) {
262271
outRect.bottom = spacing;
263272
}
@@ -271,9 +280,49 @@ private static class LessonsAdapter extends RecyclerView.Adapter<RecyclerView.Vi
271280
private final List<Object> items = new ArrayList<>();
272281

273282
void setItems(List<Object> newItems) {
283+
DiffUtil.DiffResult diff = DiffUtil.calculateDiff(new DiffUtil.Callback() {
284+
@Override
285+
public int getOldListSize() {
286+
return items.size();
287+
}
288+
289+
@Override
290+
public int getNewListSize() {
291+
return newItems.size();
292+
}
293+
294+
@Override
295+
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
296+
Object oldItem = items.get(oldItemPosition);
297+
Object newItem = newItems.get(newItemPosition);
298+
if (oldItem instanceof Lesson oldLesson && newItem instanceof Lesson newLesson) {
299+
return Objects.equals(oldLesson.title, newLesson.title);
300+
}
301+
if (oldItem instanceof Category oldCat && newItem instanceof Category newCat) {
302+
return Objects.equals(oldCat.title, newCat.title);
303+
}
304+
return oldItem instanceof AdItem && newItem instanceof AdItem;
305+
}
306+
307+
@Override
308+
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
309+
Object oldItem = items.get(oldItemPosition);
310+
Object newItem = newItems.get(newItemPosition);
311+
if (oldItem instanceof Lesson oldLesson && newItem instanceof Lesson newLesson) {
312+
return Objects.equals(oldLesson.title, newLesson.title)
313+
&& Objects.equals(oldLesson.summary, newLesson.summary)
314+
&& oldLesson.iconRes == newLesson.iconRes;
315+
}
316+
if (oldItem instanceof Category oldCat && newItem instanceof Category newCat) {
317+
return Objects.equals(oldCat.title, newCat.title)
318+
&& oldCat.iconRes == newCat.iconRes;
319+
}
320+
return true;
321+
}
322+
});
274323
items.clear();
275324
items.addAll(newItems);
276-
notifyDataSetChanged();
325+
diff.dispatchUpdatesTo(this);
277326
}
278327

279328
@Override
@@ -307,7 +356,9 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
307356

308357
@Override
309358
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
310-
int type = getItemViewType(position);
359+
int pos = holder.getBindingAdapterPosition();
360+
if (pos == RecyclerView.NO_POSITION) return;
361+
int type = getItemViewType(pos);
311362
if (type == TYPE_AD) {
312363
AdHolder adHolder = (AdHolder) holder;
313364
adHolder.adView.loadAd(new AdRequest.Builder().build(), new AdListener() {
@@ -317,12 +368,12 @@ public void onAdFailedToLoad(@NonNull LoadAdError error) {
317368
}
318369
});
319370
} else if (type == TYPE_CATEGORY) {
320-
Category category = (Category) items.get(position);
371+
Category category = (Category) items.get(pos);
321372
((CategoryHolder) holder).bind(category);
322373
} else {
323-
Lesson lesson = (Lesson) items.get(position);
324-
boolean first = position > 0 && getItemViewType(position - 1) == TYPE_CATEGORY;
325-
boolean last = position == getItemCount() - 1 || getItemViewType(position + 1) == TYPE_CATEGORY;
374+
Lesson lesson = (Lesson) items.get(pos);
375+
boolean first = pos > 0 && getItemViewType(pos - 1) == TYPE_CATEGORY;
376+
boolean last = pos == getItemCount() - 1 || getItemViewType(pos + 1) == TYPE_CATEGORY;
326377
((LessonHolder) holder).bind(lesson, first, last);
327378
}
328379
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /