Skip to content

Commit 01ae0c8

Browse files
committed
Implemented AutoCompleteTextView with person name, id, image; using MVP pattern
1 parent 9303f9c commit 01ae0c8

File tree

2 files changed

+36
-74
lines changed

2 files changed

+36
-74
lines changed

app/src/main/java/com/carboni/cinebuff/MainActivity.java

Lines changed: 1 addition & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,44 @@
11
package com.carboni.cinebuff;
22

33
import android.os.Bundle;
4-
import android.support.design.widget.FloatingActionButton;
54
import android.support.v7.app.AppCompatActivity;
65
import android.support.v7.widget.Toolbar;
7-
import android.text.Editable;
8-
import android.text.TextWatcher;
9-
import android.util.Log;
106
import android.view.View;
117
import android.view.Menu;
128
import android.view.MenuItem;
139
import android.widget.AdapterView;
14-
import android.widget.EditText;
15-
import android.widget.Toast;
1610

1711
import com.carboni.cinebuff.adapter.AutoCompleteAdapter;
18-
import com.carboni.cinebuff.model.Person;
1912
import com.carboni.cinebuff.model.Result;
20-
import com.carboni.cinebuff.presenter.PersonPresenter;
21-
import com.carboni.cinebuff.view.PersonView;
2213

2314
import butterknife.BindView;
2415
import butterknife.ButterKnife;
25-
import butterknife.OnClick;
26-
import retrofit2.Call;
27-
import retrofit2.Response;
2816

29-
public class MainActivity extends AppCompatActivity implements PersonView {
17+
public class MainActivity extends AppCompatActivity {
3018
@BindView(R.id.toolbar)
3119
Toolbar toolbar;
32-
@BindView(R.id.fab)
33-
FloatingActionButton fab;
34-
@BindView(R.id.editTextPersonQuery)
35-
EditText editTextQuery;
3620
@BindView(R.id.personAutoComplete)
3721
DelayAutoCompleteTextView searchView;
3822

39-
PersonPresenter presenter;
40-
4123
@Override
4224
protected void onCreate(Bundle savedInstanceState) {
4325
super.onCreate(savedInstanceState);
4426
setContentView(R.layout.activity_main);
4527
ButterKnife.bind(this);
4628

47-
// Giving our PersonPresenter a reference to the View
48-
presenter = new PersonPresenter(this);
49-
5029
setSupportActionBar(toolbar);
5130

52-
fab.setVisibility(View.INVISIBLE);
53-
editTextQuery.addTextChangedListener(new TextWatcher() {
54-
@Override
55-
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
56-
}
57-
58-
@Override
59-
public void onTextChanged(CharSequence s, int start, int before, int count) {
60-
if (s.length() > 0) {
61-
fab.show();
62-
} else if (s.length() == 0) {
63-
fab.hide();
64-
}
65-
}
66-
67-
@Override
68-
public void afterTextChanged(Editable s) {
69-
70-
}
71-
});
72-
7331
searchView.setThreshold(3); // min number of characters before dropdown is shown
7432
searchView.setAdapter(new AutoCompleteAdapter(this));
7533
searchView.setLoadingIndicator((android.widget.ProgressBar) findViewById(R.id.loading_indicator));
7634
searchView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
7735
@Override
7836
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
7937
Result result = (Result) parent.getItemAtPosition(position);
80-
Toast.makeText(getApplicationContext(), "Pressed " + result.getName() + " " + result.getId(), Toast.LENGTH_SHORT).show();
8138
}
8239
});
8340
}
8441

85-
/*
86-
Gather user input and pass to the presenter
87-
*/
88-
@OnClick(R.id.fab)
89-
void onFabClick() {
90-
String query = editTextQuery.getText().toString();
91-
presenter.attemptSearch(query);
92-
Log.i("MainActivity", "Presenter called to attempt search");
93-
}
94-
95-
@Override
96-
public void showSuccess(Call<Person> list, Response<Person> response) {
97-
Log.i("MainActivity", "Success");
98-
}
99-
100-
@Override
101-
public void showFailure(Throwable error) {
102-
Log.i("MainActivity", "Failure from Presenter: " + error.getMessage().toString());
103-
}
104-
10542
@Override
10643
public boolean onCreateOptionsMenu(Menu menu) {
10744
// Inflate the menu; this adds items to the action bar if it is present.

app/src/main/java/com/carboni/cinebuff/adapter/AutoCompleteAdapter.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,60 @@
99
import android.widget.BaseAdapter;
1010
import android.widget.Filter;
1111
import android.widget.Filterable;
12+
import android.widget.ImageView;
1213
import android.widget.TextView;
1314

15+
import com.bumptech.glide.Glide;
16+
import com.carboni.cinebuff.CircleTransformation;
1417
import com.carboni.cinebuff.R;
1518
import com.carboni.cinebuff.model.Person;
1619
import com.carboni.cinebuff.model.Result;
17-
import com.carboni.cinebuff.network.TMdbAPI;
20+
import com.carboni.cinebuff.presenter.PersonPresenter;
21+
import com.carboni.cinebuff.view.PersonView;
1822

19-
import java.util.ArrayList;
2023
import java.util.List;
2124

2225
import retrofit2.Call;
23-
import retrofit2.Callback;
2426
import retrofit2.Response;
25-
import retrofit2.Retrofit;
26-
import retrofit2.converter.gson.GsonConverterFactory;
2727

2828
/**
2929
* Created by ericcarboni on 10/16/16.
3030
*/
3131

32-
public class AutoCompleteAdapter extends BaseAdapter implements Filterable {
32+
public class AutoCompleteAdapter extends BaseAdapter implements Filterable, PersonView {
3333
private static final String TAG = "AutoCompleteAdapter";
3434

3535
private List<Result> list;
3636
private Context context;
37+
PersonPresenter presenter;
3738

38-
public AutoCompleteAdapter(Context context, List<Result> list) {
39+
public AutoCompleteAdapter(Context context) {
3940
Log.i(TAG, "Constructor called");
4041
this.context = context;
41-
this.list = list;
42+
this.presenter = new PersonPresenter(this);
4243
}
4344

4445
@Override
4546
public View getView(int position, View convertView, ViewGroup parent) {
4647
Log.i(TAG, "getView() called");
48+
final ImageView personImage;
49+
String baseImageUrl = "https://image.tmdb.org/t/p/w500";
4750
if (convertView == null) {
4851
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
4952
convertView = inflater.inflate(R.layout.auto_complete_item, parent, false);
53+
personImage = (ImageView) convertView.findViewById(R.id.autoCompleteImage);
54+
} else {
55+
personImage = (ImageView) convertView.findViewById(R.id.autoCompleteImage);
5056
}
5157
Result person = (Result) getItem(position);
52-
((TextView) convertView.findViewById(R.id.autoCompleteName)).setText(getItem(position).getName());
58+
((TextView) convertView.findViewById(R.id.autoCompleteName)).setText(person.getName() + " " + person.getId());
59+
Glide
60+
.with(context)
61+
.load(baseImageUrl + person.getProfilePath())
62+
.placeholder(R.mipmap.ic_person_placeholder)
63+
.transform(new CircleTransformation(context))
64+
.into(personImage);
65+
Log.i(TAG, "profile path: " + person.getProfilePath());
5366
return convertView;
5467
}
5568

@@ -62,8 +75,10 @@ protected FilterResults performFiltering(CharSequence constraint) {
6275
FilterResults filterResults = new FilterResults();
6376
if (constraint != null) {
6477
Log.i(TAG, "performFiltering() with " + constraint.toString());
65-
notifyDataSetChanged();
78+
presenter.attemptSearch(constraint.toString());
6679
}
80+
filterResults.count = getCount();
81+
filterResults.values = list;
6782
return filterResults;
6883
}
6984

@@ -98,4 +113,14 @@ public long getItemId(int position) {
98113
return list.get(position).getId();
99114
}
100115

116+
@Override
117+
public void showSuccess(Call<Person> list, Response<Person> response) {
118+
this.list = response.body().getResults();
119+
notifyDataSetChanged();
120+
}
121+
122+
@Override
123+
public void showFailure(Throwable error) {
124+
125+
}
101126
}

0 commit comments

Comments
 (0)