Skip to content

Commit 0855b72

Browse files
authored
Merge pull request #1 from BeardedPug/v1
V1
2 parents 5fe3446 + f6e8526 commit 0855b72

File tree

14 files changed

+410
-72
lines changed

14 files changed

+410
-72
lines changed

ListViewExample/app/build.gradle

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@ android {
1818
}
1919
}
2020

21+
repositories {
22+
mavenCentral()
23+
}
24+
2125
dependencies {
26+
implementation 'org.slf4j:slf4j-api:1.7.25'
27+
implementation 'ch.qos.logback:logback-classic:1.0.9'
28+
implementation 'ch.qos.logback:logback-core:1.0.9'
29+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.7.0'
30+
implementation 'org.projectlombok:lombok:1.18.4'
31+
annotationProcessor 'org.projectlombok:lombok:1.18.4'
2232
implementation fileTree(dir: 'libs', include: ['*.jar'])
2333
implementation 'com.android.support:appcompat-v7:28.0.0'
2434
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

ListViewExample/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@
1818
</activity>
1919
</application>
2020

21+
<uses-permission android:name="android.permission.INTERNET"/>
2122
</manifest>
Lines changed: 101 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,114 @@
11
package com.loot.markhardwick.listviewexample;
22

3-
import android.support.v7.app.AppCompatActivity;
3+
import android.annotation.SuppressLint;
4+
import android.app.Activity;
5+
import android.content.Context;
46
import android.os.Bundle;
7+
import android.view.LayoutInflater;
8+
import android.view.View;
9+
import android.view.ViewGroup;
10+
import android.widget.BaseAdapter;
11+
import android.widget.ListView;
12+
import android.widget.ProgressBar;
13+
import android.widget.TextView;
514

6-
import com.loot.markhardwick.listviewexample.ui.main.MainFragment;
15+
import com.loot.markhardwick.listviewexample.backend.main.Fetcher;
16+
import com.loot.markhardwick.listviewexample.backend.main.User;
717

8-
public class MainActivity extends AppCompatActivity {
18+
public class MainActivity extends Activity {
19+
ListAdapter adapter;
920

1021
@Override
1122
protected void onCreate(Bundle savedInstanceState) {
1223
super.onCreate(savedInstanceState);
1324
setContentView(R.layout.main_activity);
14-
if (savedInstanceState == null) {
15-
getSupportFragmentManager().beginTransaction()
16-
.replace(R.id.container, MainFragment.newInstance())
17-
.commitNow();
25+
26+
ListView listView = findViewById(R.id.listView);
27+
ProgressBar progressBar = findViewById(R.id.progressBar);
28+
listView.setEmptyView(progressBar);
29+
30+
adapter = new ListAdapter(this, Fetcher.getUsers());
31+
listView.setAdapter(adapter);
32+
33+
/* Not needed for task will flesh out later
34+
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
35+
@Override
36+
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
37+
38+
}
39+
});
40+
*/
41+
42+
Fetcher fetcher = new Fetcher(new Fetcher.FetcherResponse() {
43+
@Override
44+
public void processFinish(User[] newUserList) {
45+
adapter.updateUsers(newUserList);
46+
}
47+
});
48+
fetcher.execute();
49+
}
50+
51+
private class ListAdapter extends BaseAdapter {
52+
Context context;
53+
User[] users;
54+
private LayoutInflater inflater;
55+
56+
ListAdapter(Context context, User[] users) {
57+
this.context = context;
58+
this.users = users;
59+
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
60+
}
61+
62+
void updateUsers(User[] newUsers){
63+
users = newUsers;
64+
this.notifyDataSetChanged();
65+
}
66+
67+
@Override
68+
public int getCount() {
69+
return users.length;
70+
}
71+
72+
@Override
73+
public Object getItem(int position) {
74+
return users[position];
75+
}
76+
77+
@Override
78+
public long getItemId(int position) {
79+
return position;
80+
}
81+
82+
@SuppressLint("DefaultLocale")
83+
@Override
84+
public View getView(int position, View convertView, ViewGroup parent) {
85+
View toReturn = convertView;
86+
if(toReturn == null){
87+
toReturn = inflater.inflate(R.layout.row_just_name, null);
88+
}
89+
User user = users[position];
90+
TextView nameField = toReturn.findViewById(R.id.name);
91+
nameField.setText(String.format("%s", user.getName()));
92+
93+
/* Reread task was only for name and surname
94+
TextView idField = toReturn.findViewById(R.id.idNumber);
95+
idField.setText(String.format("%s%d", getString(R.string.id), user.getId()));
96+
TextView usernameField = toReturn.findViewById(R.id.username);
97+
usernameField.setText(String.format("%s%s", getString(R.string.username), user.getUsername()));
98+
TextView emailField = toReturn.findViewById(R.id.email);
99+
emailField.setText(String.format("%s%s", getString(R.string.email), user.getEmail()));
100+
TextView addressField = toReturn.findViewById(R.id.address);
101+
addressField.setText(String.format("%s%s", getString(R.string.address), user.getAddress().toString()));
102+
TextView phoneField = toReturn.findViewById(R.id.phone);
103+
phoneField.setText(String.format("%s%s", getString(R.string.phone), user.getPhone()));
104+
TextView websiteField = toReturn.findViewById(R.id.website);
105+
websiteField.setText(String.format("%s%s", getString(R.string.website), user.getWebsite()));
106+
TextView companyField = toReturn.findViewById(R.id.company);
107+
companyField.setText(String.format("%s%s", getString(R.string.company), user.getCompany().toString()));
108+
*/
109+
return toReturn;
18110
}
19111
}
20112
}
113+
114+
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.loot.markhardwick.listviewexample.backend.main;
2+
3+
import android.os.AsyncTask;
4+
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
7+
import java.io.IOException;
8+
import java.io.InputStream;
9+
import java.net.HttpURLConnection;
10+
import java.net.URL;
11+
import java.util.Arrays;
12+
13+
import lombok.extern.slf4j.Slf4j;
14+
15+
/**
16+
* Class to grab json array of users from:
17+
* https://jsonplaceholder.typicode.com/users
18+
* and turn response into an array of objects
19+
*/
20+
21+
@Slf4j
22+
public class Fetcher extends AsyncTask<Void, Void, User[]> {
23+
static User[] users = new User[0];
24+
private FetcherResponse delegate;
25+
26+
public Fetcher(FetcherResponse delegate){
27+
this.delegate = delegate;
28+
}
29+
30+
static void fetchUsers() {
31+
log.debug("fetchUsers() called");
32+
URL url;
33+
HttpURLConnection con;
34+
try {
35+
String urlAddress = "https://jsonplaceholder.typicode.com/users";
36+
url = new URL(urlAddress);
37+
con = (HttpURLConnection) url.openConnection();
38+
con.setRequestMethod("GET");
39+
con.setRequestProperty("Content-Type", "application/json");
40+
int status = con.getResponseCode();
41+
log.debug("Http Response Code: {}", status);
42+
if (getBaseResponseCode(status) == 2){
43+
InputStream inputStream = con.getInputStream();
44+
handleResponse(inputStream);
45+
} else {
46+
log.error("Http Error Code: {}", status);
47+
}
48+
} catch (java.io.IOException e) {
49+
log.error(e.getMessage());
50+
log.error(Arrays.toString(e.getStackTrace()));
51+
}
52+
}
53+
54+
private static void handleResponse(InputStream inputStream){
55+
log.debug("handleResponse() called");
56+
ObjectMapper mapper = new ObjectMapper();
57+
try {
58+
users = mapper.readValue(inputStream, User[].class);
59+
log.debug("New contents of Users:");
60+
log.debug(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(users));
61+
log.debug("Successful response handle");
62+
} catch (IOException e) {
63+
log.error(e.getMessage());
64+
log.error(Arrays.toString(e.getStackTrace()));
65+
}
66+
}
67+
68+
private static int getBaseResponseCode(int x) {
69+
while (x > 10) {
70+
x = x / 10;
71+
}
72+
return x;
73+
}
74+
75+
public static User[] getUsers(){
76+
return users;
77+
}
78+
79+
@Override
80+
protected User[] doInBackground(Void ... voids) {
81+
fetchUsers();
82+
return users;
83+
}
84+
85+
@Override
86+
protected void onPostExecute(User[] result) {
87+
delegate.processFinish(result);
88+
}
89+
90+
public interface FetcherResponse {
91+
void processFinish(User[] newUserList);
92+
}
93+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.loot.markhardwick.listviewexample.backend.main;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
import lombok.ToString;
8+
import lombok.extern.slf4j.Slf4j;
9+
10+
/**
11+
* POJO for jackson deserialization of users
12+
*/
13+
14+
@Setter @Getter
15+
@AllArgsConstructor
16+
@NoArgsConstructor
17+
@Slf4j
18+
public class User {
19+
int id;
20+
String name, username, email, phone, website;
21+
Address address;
22+
Company company;
23+
24+
@ToString
25+
@Setter @Getter
26+
@AllArgsConstructor
27+
@NoArgsConstructor
28+
public class Address {
29+
String street, suite, city, zipcode;
30+
Geo geo;
31+
32+
@ToString
33+
@Setter @Getter
34+
@AllArgsConstructor
35+
@NoArgsConstructor
36+
public class Geo {
37+
String lat, lng;
38+
}
39+
}
40+
41+
@ToString
42+
@Setter @Getter
43+
@AllArgsConstructor
44+
@NoArgsConstructor
45+
public class Company {
46+
String name, catchPhrase, bs;
47+
}
48+
}
49+

ListViewExample/app/src/main/java/com/loot/markhardwick/listviewexample/ui/main/MainFragment.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

ListViewExample/app/src/main/java/com/loot/markhardwick/listviewexample/ui/main/MainViewModel.java

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,50 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
2+
<android.support.constraint.ConstraintLayout
3+
xmlns:android="http://schemas.android.com/apk/res/android"
34
xmlns:tools="http://schemas.android.com/tools"
5+
xmlns:app="http://schemas.android.com/apk/res-auto"
46
android:id="@+id/container"
57
android:layout_width="match_parent"
68
android:layout_height="match_parent"
7-
tools:context=".MainActivity" />
9+
tools:context=".MainActivity"
10+
>
11+
12+
<Toolbar
13+
android:id="@+id/toolbar"
14+
android:layout_width="match_parent"
15+
android:layout_height="wrap_content"
16+
android:background="@color/colorPrimary"
17+
>
18+
19+
<TextView
20+
android:layout_width="wrap_content"
21+
android:layout_height="wrap_content"
22+
android:text="@string/header"
23+
android:textSize="22sp"
24+
android:textColor="@color/white"
25+
android:textStyle="bold"
26+
/>
27+
28+
</Toolbar>
29+
30+
<ListView
31+
android:id="@+id/listView"
32+
android:layout_width="wrap_content"
33+
android:layout_height="wrap_content"
34+
android:layout_marginTop="20dp"
35+
app:layout_constraintTop_toBottomOf="@+id/toolbar"
36+
/>
37+
38+
<ProgressBar
39+
android:id="@+id/progressBar"
40+
android:layout_width="wrap_content"
41+
android:layout_height="wrap_content"
42+
app:layout_constraintBottom_toBottomOf="parent"
43+
app:layout_constraintEnd_toEndOf="parent"
44+
app:layout_constraintStart_toStartOf="parent"
45+
app:layout_constraintTop_toTopOf="parent"
46+
android:indeterminate="true"
47+
android:indeterminateTint="@color/colorAccent2"
48+
android:visibility="invisible"
49+
/>
50+
</android.support.constraint.ConstraintLayout>

0 commit comments

Comments
 (0)