2424import android .view .View ;
2525import android .widget .AdapterView ;
2626import android .widget .Button ;
27+ import android .widget .GridView ;
2728import android .widget .ImageButton ;
2829import android .widget .ImageView ;
2930import android .widget .LinearLayout ;
30- import android .widget .ListView ;
3131import android .widget .PopupMenu ;
3232import android .widget .TextView ;
3333import android .widget .ViewFlipper ;
4343import org .json .JSONObject ;
4444
4545public class MainActivity extends BaseActivity implements PopupMenu .OnMenuItemClickListener {
46- private static record Tab (String url , String title , ListView listView , LinearLayout button ) {}
46+ private static record Tab (String url , String title , GridView groupView , LinearLayout button ) {}
4747
4848 private static final int SETTINGS_REQUEST_CODE = 1 ;
4949
@@ -66,7 +66,7 @@ public void onCreate(Bundle savedInstanceState) {
6666
6767 findViewById (R .id .main_refresh_button ).setOnClickListener (view -> {
6868 for (var tab : tabs ) {
69- var articlesAdapter = (ArticlesAdapter )tab .listView .getAdapter ();
69+ var articlesAdapter = (ArticlesAdapter )tab .groupView .getAdapter ();
7070 fetchNewsData (tab .url , false , articlesAdapter );
7171 }
7272 });
@@ -81,25 +81,23 @@ public void onCreate(Bundle savedInstanceState) {
8181 // Init tabs
8282 tabs = new ArrayList <>();
8383 tabs .add (new Tab ("https://feeds.nos.nl/nosnieuwsalgemeen" , getString (R .string .main_latest_title ),
84- (ListView )findViewById (R .id .main_latest_articles_list ),
85- (LinearLayout )findViewById (R .id .main_latest_button )));
84+ findViewById (R .id .main_latest_articles_list ), findViewById (R .id .main_latest_button )));
8685 tabs .add (new Tab ("https://feeds.nos.nl/nosnieuwseconomie" , getString (R .string .main_economy_title ),
87- (ListView )findViewById (R .id .main_economy_articles_list ),
88- (LinearLayout )findViewById (R .id .main_economy_button )));
86+ findViewById (R .id .main_economy_articles_list ), findViewById (R .id .main_economy_button )));
8987 tabs .add (new Tab ("https://feeds.nos.nl/nosnieuwspolitiek" , getString (R .string .main_politics_title ),
90- (ListView )findViewById (R .id .main_politics_articles_list ),
91- (LinearLayout )findViewById (R .id .main_politics_button )));
88+ findViewById (R .id .main_politics_articles_list ), findViewById (R .id .main_politics_button )));
9289 tabs .add (new Tab ("https://feeds.nos.nl/nosnieuwstech" , getString (R .string .main_tech_title ),
93- ( ListView ) findViewById (R .id .main_tech_articles_list ), ( LinearLayout ) findViewById (R .id .main_tech_button )));
90+ findViewById (R .id .main_tech_articles_list ), findViewById (R .id .main_tech_button )));
9491 tabs .add (new Tab ("https://feeds.nos.nl/nossportalgemeen" , getString (R .string .main_sports_title ),
95- (ListView )findViewById (R .id .main_sports_articles_list ),
96- (LinearLayout )findViewById (R .id .main_sports_button )));
92+ findViewById (R .id .main_sports_articles_list ), findViewById (R .id .main_sports_button )));
9793
9894 for (var i = 0 ; i < tabs .size (); i ++) {
9995 var tab = tabs .get (i );
10096 var articlesAdapter = new ArticlesAdapter (this );
101- tab .listView .setAdapter (articlesAdapter );
102- tab .listView .setOnItemClickListener ((AdapterView <?> parent , View view , int position , long id ) -> {
97+ var display = getResources ().getDisplayMetrics ();
98+ tab .groupView .setNumColumns (Math .min (Math .max (1 , display .widthPixels / (int )(240 * display .density )), 4 ));
99+ tab .groupView .setAdapter (articlesAdapter );
100+ tab .groupView .setOnItemClickListener ((AdapterView <?> parent , View view , int position , long id ) -> {
103101 var intent = new Intent (this , ArticleActivity .class );
104102 intent .putExtra ("article" , articlesAdapter .getItem (position ));
105103 startActivity (intent );
@@ -143,26 +141,28 @@ public void onActivityResult(int requestCode, int resultCode, @SuppressWarnings(
143141 @ Override
144142 public void onSaveInstanceState (Bundle savedInstanceState ) {
145143 super .onSaveInstanceState (savedInstanceState );
144+
146145 var openTabIndex = viewFlipper .getDisplayedChild ();
147146 savedInstanceState .putInt ("openTab" , openTabIndex );
148- var currentListView = tabs .get (openTabIndex ).listView ;
149- var firstChild = currentListView .getChildAt (0 );
150- var offset = (firstChild == null ) ? 0 : firstChild .getTop () - currentListView .getPaddingTop ();
151- savedInstanceState .putInt ("listScrollIndex" , currentListView .getFirstVisiblePosition ());
147+
148+ var currentGroupView = tabs .get (openTabIndex ).groupView ;
149+ var firstChild = currentGroupView .getChildAt (0 );
150+ var offset = (firstChild == null ) ? 0 : firstChild .getTop () - currentGroupView .getPaddingTop ();
151+ savedInstanceState .putInt ("listScrollIndex" , currentGroupView .getFirstVisiblePosition ());
152152 savedInstanceState .putInt ("listScrollOffset" , offset );
153153 }
154154
155155 @ Override
156156 public void onRestoreInstanceState (Bundle savedInstanceState ) {
157157 super .onRestoreInstanceState (savedInstanceState );
158+
158159 var openTabIndex = savedInstanceState .getInt ("openTab" );
159160 openTab (openTabIndex , false );
160- handler .post (() -> {
161- var currentListView = tabs .get (openTabIndex ).listView ;
162- int index = savedInstanceState .getInt ("listScrollIndex" );
163- int offset = savedInstanceState .getInt ("listScrollOffset" );
164- currentListView .setSelectionFromTop (index , offset );
165- });
161+
162+ var currentGroupView = tabs .get (openTabIndex ).groupView ;
163+ int index = savedInstanceState .getInt ("listScrollIndex" , 0 );
164+ int offset = savedInstanceState .getInt ("listScrollOffset" , 0 );
165+ handler .post (() -> currentGroupView .setSelectionFromTop (index , offset ));
166166 }
167167
168168 @ Override
0 commit comments