Sunteți pe pagina 1din 27

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatica si Microelectronica

Departamentul Ingineria Software si Automatica

RAPORT
Lucrarea de laborator nr.5-6
Programarea aplicatiilor mobile
Tema: Telemedicine-SPRINT2

A efectuat:

A verificat:
asist. univ. C. Rusu

Chisinau 2017
Scopul lucrarii
Pentru designul ofert in laboratorul nr. 5 să se implementeze partea funcțională a proiectului conform
serviciului API descris mai jos.
Metodele oferite de Servicu:
Auth (autentificare)
Reg (inregistrare)
UserProfie (extragerea avansată despre utilizatorul curent autentificat)
UpdateUserProfile (NotImplemented) - nu cred că o voi implementa
GetDocList (vizualizarea listei de medici activi in sistem)
GetDoc (vizualizarea unui anumit medici activ in sistem)
UserRequestConsultation (Adaugarea unei programari la medic)

Desfasurarea lucrarii de laborator

Cand începe aplicația, apare SPLASH SCREEN, adică ecran de boot, este folosit un cronometru și
apoi va aparea WELCOME SCREEN

2
// Splash screen timer
private static int SPLASH_TIME_OUT = 3000;
private String prevTitle;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);

new Handler().postDelayed(new Runnable() {


@Override
public void run() {
// This method will be executed once the timer is over
// Start your app main activity
Intent i = new Intent(SplashScreenActivity.this,
WelcomeScreenActivity.class);
startActivity(i);

// close this activity


finish();
}
}, SPLASH_TIME_OUT);
}

În WELCOME SCREEN, putem merge la pagina de înregistrare cu butoanele Sing Up sau pe pagina
de autentificare utilizând butonul Login. În acest caz, Intent este folosit, care este un obiect de schimb de
mesaje, cu care pot fi folosite pentru a solicita acțiunea componentei altei cereri. Componenta Activitate
este un singur ecran în aplicație. Pentru a începe o nouă instanță a componentei Activitate, trebuie să treci
un obiect Intent thestartActivity () metoda. Obiectul Intent descrie operația pe care doriți să o porniți și De
asemenea, conține toate celelalte date necesare.

protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_screen);

findViewById(R.id.btn_signup).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openSignupActivity();
}
});
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openLoginActivity();
}
});
3
}

public void openLoginActivity(){


Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}

public void openSignupActivity(){


Intent intent = new Intent(this, SignupActivity.class);
startActivity(intent);
}

În LOGIN SCREEN, o solicitare de conectare este trimisă pe server. Dacă reușim token primit este
salvat și ecranul HOME este deschis, altfel vine o notificare.

public static void sendAndHandleLoginRequest(final Context context, String validatedEmail,


String validatedPassword){
RemoteApi.getApi().userAuth(new UserAuthBody(validatedEmail, validatedPassword)
).enqueue(new Callback<UserAuthResult>() {
@Override
public void onResponse(Call<UserAuthResult> call, Response<UserAuthResult>
), response); if (!response.isSuccessful()){
responseng(
4
Toast.makeText(context, "Unable to send auth request",
Toast.LENGTH_LONG).show();
}
else if (!response.body().getStatus().equalsIgnoreCase("SUCCESS")){
Toast.makeText(context, "Invalid username/password",
Toast.LENGTH_LONG).show();
}
else if (response.body().getStatus().equalsIgnoreCase("SUCCESS")){
RemoteApi.setTOKEN(response.body().getMessage());
Log.d(context.toString(), "TOKEN - " + RemoteApi.getTOKEN());
LoginActivity.openHomeActivity(context);
}
}

@Override
public void onFailure(Call<UserAuthResult> call, Throwable t) {
RemoteApiUtils.logResponse(context.getClass().toString(), t);
Toast.makeText(context, "Unable to send auth request. IOException",
Toast.LENGTH_LONG).show();
}
});
}

În ecranul SIGNUP SCREEN, datele utilizatorului sunt introduse. În cazul în care utilizatorul nu a
introdus niciun fel de date, apoi apare un avertisment că ar trebui să va asigurați-vă că ați introdus.

private boolean validateFieldsAndSetBDate(){


boolean result = true;
SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yy");

if (address.getText() == null || address.getText().toString().isEmpty()){


result = false;
address.setError("This field is required");
}
if (phone.getText() == null || phone.getText().toString().isEmpty()){
result = false;
phone.setError("This field is required");
}
if (name.getText() == null || name.getText().toString().isEmpty()){
result = false;
name.setError("This field is required");
}
if (!LoginActivity.validateEmail(email.getText().toString())){
result = false;
email.setError("Wrong email format");
}
try {

5
dt_bday = formatter.parse(bday.getText().toString());
} catch (ParseException | NullPointerException e) {
result = false;
bday.setError("Date should be in dd/mm/yy format");
}
return result;
}

Ecranul COMPLET SIGNUP trimite o solicitare de înregistrare la server. Dacă este reușit, codul va fi
201. Noul utilizator va fi inregistrat și va fi deschis HOME SCREEN . În caz contrar, este emisa o notificare.

private void registerAndLogin(){


RemoteApi.getApi().userRegistration(regBody).enqueue(new Callback<Class<Void>>() {
@Override
public void onResponse(Call<Class<Void>> call, Response<Class<Void>> response) {
if (response.code() != 201){
RemoteApiUtils.logResponse(activity.toString(), response);
Toast.makeText(activity, "Registration failed. Please try again",
Toast.LENGTH_LONG).show();
}
else {
LoginActivity.sendAndHandleLoginRequest(activity, regBody.getEmail(),
regBody.getPassword());
}
}

@Override
public void onFailure(Call<Class<Void>> call, Throwable t) {
RemoteApiUtils.logResponse(activity.toString(), t);
Toast.makeText(activity, "Registration failed. Please try again",
Toast.LENGTH_LONG).show();
}
});
}

DoctorListActivity utilizează DoctorListAdapter. Adaptorii simplifică legarea date cu controlul.


Există un set de obiecte și există o componentă Vizualizare. Denumirea adaptorul este de a oferi vederi
pentru container. Adaptor ia datele și metadatele unui anumit container și construiește vizualizarea fiecărui
copil. De exemplu, creăm elemente de listă (un șir de șiruri de caractere) și le transmitem în lista ListView.

6
public void onBindViewHolder(DoctorViewHolder docviewholder, int position) {
mCursor.moveToPosition(position);

DoctorProfile dp = new DoctorProfile(null,null,


null,null,null,null,null);

// icon
String doctorPhoto = dp.getPhoto();

//docviewholder.iconView.setText(doctorPhoto);

//forecastAdapterViewHolder.iconView.setImageResource(weatherImageId);

// first & last name


String doctorName = dp.getFullName();

docviewholder.nameView.setText(doctorName);

// speciality

String speciality = dp.getSpecs();

7
docviewholder.descriptionView.setText(speciality);

//stars

Double stars = dp.getStars();


String st = Double.toString(stars);
docviewholder.adressView.setText(st);

//adress
String adress = dp.getAddress();
docviewholder.adressView.setText(adress);

@Override
public int getItemCount() {
if (null == mCursor) return 0;
return mCursor.getCount();
}

8
Concluzii
În cadrul acestei lucrări de laborator, partea logică a aplicației Telemedicine utilizând următorul punct
de vedere din lucrările de laborator nr. 5: SPLASH SCREEN, WELCOME SCREEN, SCREEN LOGIN /
SIGNUP, SCREEN HOME, APPROVED REQUEST SCREEN, DOCTOR LIST, DOCTOR CONTACTS.
Au fost implementate metode precum înregistrarea, autentificarea, utilizarea, obținerea unei liste de doctori
și detalii despre acestea, adăugând consultatiile medicului. În rezultat a fost o interfață de utilizator cu
drepturi depline și o parte logică a aplicației Android numită Telemedicine.

9
Bibliografie
1 Tutorial [Resursă electronică]. Regim de acces: https://www.youtube.com/
2 Material ajutator [Resursă electronică]. Regim de acces: https://stackoverflow.com/

10
Anexa
Codul sursa

SplashScreenActivity
package com.example.vicup.telemedicine;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;

public class SplashScreenActivity extends AppCompatActivity {

// Splash screen timer


private static int SPLASH_TIME_OUT = 3000;
private String prevTitle;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);

new Handler().postDelayed(new Runnable() {

/*
* Showing splash screen with a timer. This will be useful when you
* want to show case your app logo / company
*/

@Override
public void run() {
// This method will be executed once the timer is over
// Start your app main activity
Intent i = new Intent(SplashScreenActivity.this, WelcomeScreenActivity.class);
startActivity(i);

// close this activity


finish();
}
}, SPLASH_TIME_OUT);
}

@Override
protected void onStart() {
super.onStart();
prevTitle = getTitle().toString();
setTitle("");
}
11
@Override
protected void onStop() {
super.onStop();
setTitle(prevTitle);
}
}

WelcomeScreenActivity
package com.example.vicup.telemedicine;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class WelcomeScreenActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_screen);

findViewById(R.id.btn_signup).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openSignupActivity();
}
});
findViewById(R.id.btn_login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openLoginActivity();
}
});
}

public void openLoginActivity(){


Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}

public void openSignupActivity(){


Intent intent = new Intent(this, SignupActivity.class);
startActivity(intent);
}
}

12
LoginActivity
package com.example.vicup.telemedicine;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.example.vicup.telemedicine.api.RemoteApi;
import com.example.vicup.telemedicine.api.RemoteApiUtils;
import com.example.vicup.telemedicine.api.entities.UserAuthBody;
import com.example.vicup.telemedicine.api.entities.UserAuthResult;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
leftIconsInit();

findViewById(R.id.btn_login).setOnClickListener(this);
findViewById(R.id.btn_signup).setOnClickListener(this);
}

@Override
public void onClick(View v) {
final EditText email = (EditText) findViewById(R.id.email);
final EditText password = (EditText) findViewById(R.id.pass);

switch (v.getId()){
case R.id.btn_login:
if (!validateEmail(email.getText().toString())) {
email.setError("Invalid Email");
email.requestFocus();
} else if (!validatePassword(password.getText().toString())) {
password.setError("Invalid Password");
13
password.requestFocus();
} else {
sendAndHandleLoginRequest(v.getContext(), email.getText().toString(),
password.getText().toString());
}
break;

case R.id.btn_signup:
openSignupActivity(v.getContext());
break;
}
}

private void leftIconsInit(){


final EditText email = (EditText) findViewById(R.id.email);
final EditText password = (EditText) findViewById(R.id.pass);
final float density = getResources().getDisplayMetrics().density;
final Drawable drawable_email = getResources().getDrawable(R.drawable.login);
final Drawable drawable_password = getResources().getDrawable(R.drawable.pass);

final int width = Math.round(27 * density);


final int height = Math.round(30 * density);

drawable_email.setBounds(6, 3, width, height);


email.setCompoundDrawables(drawable_email, null, null, null);
drawable_password.setBounds(6, 3, width, height);
password.setCompoundDrawables(drawable_password, null, null, null);
}

/**
* Sends login request to the server.
* <ul>
* <li>On success, save received token and open HomeScreen activity;</li>
* <li>On failure, make a toast with appropriate message.</li>
* </ul>
* @param context Context to make a Toast with error message
* @param validatedEmail Email in valid format (according to {@link
#validateEmail(String)})
* @param validatedPassword Password in valid format (according to {@link
#validatePassword(String)})
*/
public static void sendAndHandleLoginRequest(final Context context, String validatedEmail,
String validatedPassword){
RemoteApi.getApi().userAuth(new UserAuthBody(validatedEmail, validatedPassword)
).enqueue(new Callback<UserAuthResult>() {
@Override
public void onResponse(Call<UserAuthResult> call, Response<UserAuthResult>
response) {
RemoteApiUtils.logResponse(this.getClass().toString(), response);

14
if (!response.isSuccessful()){
Toast.makeText(context, "Unable to send auth request",
Toast.LENGTH_LONG).show();
}
else if (!response.body().getStatus().equalsIgnoreCase("SUCCESS")){
Toast.makeText(context, "Invalid username/password",
Toast.LENGTH_LONG).show();
}
else if (response.body().getStatus().equalsIgnoreCase("SUCCESS")){
RemoteApi.setTOKEN(response.body().getMessage());
Log.d(context.toString(), "TOKEN - " + RemoteApi.getTOKEN());
LoginActivity.openHomeActivity(context);
}
}

@Override
public void onFailure(Call<UserAuthResult> call, Throwable t) {
RemoteApiUtils.logResponse(context.getClass().toString(), t);
Toast.makeText(context, "Unable to send auth request. IOException",
Toast.LENGTH_LONG).show();
}
});
}

public static void openSignupActivity(Context context){


Intent intent = new Intent(context, SignupActivity.class);
context.startActivity(intent);
}

/**
* Call on successful login only
*/
public static void openHomeActivity(Context context){
Intent intent = new Intent(context, HomeActivity.class);
context.startActivity(intent);
}

//Return true if password is valid and false if password is invalid


public static boolean validatePassword(String password) {
if (password == null){
return false;
}
return password.length() > 6;
}

//Return true if email is valid and false if email is invalid


public static boolean validateEmail(String email) {
if (email == null || email.isEmpty()){
return false;

15
}
String emailPattern = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

Pattern pattern = Pattern.compile(emailPattern);


Matcher matcher = pattern.matcher(email);

return matcher.matches();

}
}

SignupActivity
package com.example.vicup.telemedicine;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;

import com.example.vicup.telemedicine.api.entities.UserRegBody;

import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class SignupActivity extends AppCompatActivity implements View.OnClickListener{

public static String REG_BODY_EXTRAS_KEY = "REG_BODY";


private UserRegBody regBody;
private EditText name;
private EditText email;
private EditText bday;
private Date dt_bday;
private EditText phone;
private EditText address;
private String prevTitle;

@Override
protected void onStart() {
super.onStart();
prevTitle = getTitle().toString();
setTitle("Registration");
}

@Override
protected void onStop() {
16
super.onStop();
setTitle(prevTitle);
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
initVariables();
setViewClickListeners();
fillInFields();
}

private void setViewClickListeners(){


findViewById(R.id.userPhoto).setOnClickListener(this);
findViewById(R.id.btn_reg_next).setOnClickListener(this);
}

private void initVariables(){


name = (EditText) findViewById(R.id.txt_name);
email = (EditText) findViewById(R.id.txt_email);
bday = (EditText) findViewById(R.id.txt_bday);
phone = (EditText) findViewById(R.id.txt_phone);
address = (EditText) findViewById(R.id.txt_address);
}

// FOR TEST ONLY


private void fillInFields(){
name.setText("");
email.setText("");
bday.setText("");
phone.setText("");
address.setText("");
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.userPhoto:
break;
case R.id.btn_reg_next:
if (!validateFieldsAndSetBDate()){
break;
}
regBody = new UserRegBody();
regBody.setAddress(address.getText().toString());
regBody.setEmail(email.getText().toString());
regBody.setFullName(name.getText().toString());
regBody.setBirthday(dt_bday);

17
regBody.setPhone(phone.getText().toString());
/**
* TODO
*/
regBody.setBase64photo(null);

// start new activity and send completed fields to it


Intent i = new Intent(this, CompleteSignupActivity.class);
i.putExtra(REG_BODY_EXTRAS_KEY, regBody);
startActivity(i);
break;
}
}

// setting dt_bdate here to avoid handling ParseException twice


private boolean validateFieldsAndSetBDate(){
boolean result = true;
SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yy");

if (address.getText() == null || address.getText().toString().isEmpty()){


result = false;
address.setError("This field is required");
}
if (phone.getText() == null || phone.getText().toString().isEmpty()){
result = false;
phone.setError("This field is required");
}
if (name.getText() == null || name.getText().toString().isEmpty()){
result = false;
name.setError("This field is required");
}
if (!LoginActivity.validateEmail(email.getText().toString())){
result = false;
email.setError("Wrong email format");
}
try {
dt_bday = formatter.parse(bday.getText().toString());
} catch (ParseException | NullPointerException e) {
result = false;
bday.setError("Date should be in dd/mm/yy format");
}
return result;
}
}

CompleteSignupActivity
package com.example.vicup.telemedicine;

import android.content.Context;
18
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.example.vicup.telemedicine.api.RemoteApi;
import com.example.vicup.telemedicine.api.RemoteApiUtils;
import com.example.vicup.telemedicine.api.entities.UserRegBody;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class CompleteSignupActivity extends AppCompatActivity implements View.OnClickListener{

private UserRegBody regBody;


private EditText username;
private EditText password;
private String prevTitle;
private final Context activity = this;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_complete_signup);

setViewClickListeners();
initVariables();
}

@Override
protected void onStart() {
super.onStart();
prevTitle = getTitle().toString();
setTitle("Complete your registration");
}

@Override
protected void onStop() {
super.onStop();
setTitle(prevTitle);
}

private void setViewClickListeners(){


findViewById(R.id.btn_register).setOnClickListener(this);
}

private void initVariables(){

19
username = (EditText) findViewById(R.id.txt_user_name);
password = (EditText) findViewById(R.id.txt_password);
regBody = (UserRegBody) this.getIntent()
.getSerializableExtra(SignupActivity.REG_BODY_EXTRAS_KEY);
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_register:
if (!validateFields()){
break;
}
regBody.setUsername(username.getText().toString());
regBody.setPassword(password.getText().toString());

registerAndLogin();
break;
}
}

private boolean validateFields(){


boolean result = true;
if (username.getText() == null || username.getText().toString().isEmpty()){
result = false;
username.setError("This field is required");
}

if (password.getText() == null ||
!LoginActivity.validatePassword(password.getText().toString())){
result = false;
password.setError("This field is required");
}

return result;
}

/**
* Sends registration request to the server. Uses <b>regBody</b> local variable to get
necessary data<br/>
* On registration success, sends login request too using {@link
LoginActivity#sendAndHandleLoginRequest(Context, String, String)}.
* <ul>
* <li>On success - registrates new user, saves received token and opens HomeScreen
activity;</li>
* <li>On failure - makes a toast with appropriate message.</li>
* </ul>
*/
private void registerAndLogin(){

20
RemoteApi.getApi().userRegistration(regBody).enqueue(new Callback<Class<Void>>() {
@Override
public void onResponse(Call<Class<Void>> call, Response<Class<Void>> response) {
if (response.code() != 201){
RemoteApiUtils.logResponse(activity.toString(), response);
Toast.makeText(activity, "Registration failed. Please try again",
Toast.LENGTH_LONG).show();
}
else {
LoginActivity.sendAndHandleLoginRequest(activity, regBody.getEmail(),
regBody.getPassword());
}
}

@Override
public void onFailure(Call<Class<Void>> call, Throwable t) {
RemoteApiUtils.logResponse(activity.toString(), t);
Toast.makeText(activity, "Registration failed. Please try again",
Toast.LENGTH_LONG).show();
}
});
}
}

HomeActivity
package com.example.zveri.telemedicine;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class HomeActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
}
}

ApprovedRequestActivity
package com.example.vicup.telemedicine;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class ApprovedRequestActivity extends AppCompatActivity {


@Override

21
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
setContentView(R.layout.approved_request_screen);
}

DoctorListActivit
package com.example.vicup.telemedicine;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

public class DoctorListActivity extends AppCompatActivity


implements DoctorListAdapter.ListItemClickListener{

private Toast mToast;


private DoctorListAdapter mDoctorListAdapter;
private RecyclerView mRecyclerView;
private int mPosition = RecyclerView.NO_POSITION;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.doctors_list);

mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview_forecast);

LinearLayoutManager layoutManager =
new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

mRecyclerView.setLayoutManager(layoutManager);

mRecyclerView.setHasFixedSize(true);

mDoctorListAdapter = new DoctorListAdapter(this, this);

/* Setting the adapter attaches it to the RecyclerView in our layout. */


mRecyclerView.setAdapter(mDoctorListAdapter);
}

@Override
public void onListItemClick(int clickedItemIndex) {

if (mToast != null) {
22
mToast.cancel();
}

String toastMessage = "Item #" + clickedItemIndex + " clicked.";


mToast = Toast.makeText(this, toastMessage, Toast.LENGTH_LONG);

mToast.show();
}
}

DoctorListAdapter
package com.example.vicup.telemedicine;

import android.content.Context;
import android.database.Cursor;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.vicup.telemedicine.api.entities.DoctorProfile;

class DoctorListAdapter extends RecyclerView.Adapter<DoctorListAdapter.DoctorViewHolder> {

/* The context we use to utility methods, app resources and layout inflaters */
private final Context mContext;
/*
* Below, we've defined an interface to handle clicks on items within this Adapter. In the
* constructor of our ForecastAdapter, we receive an instance of a class that has
implemented
* said interface. We store that instance in this variable to call the onClick method
whenever
* an item is clicked in the list.
*/
final private ListItemClickListener mOnClickListener;

public interface ListItemClickListener {


void onListItemClick(int clickedItemIndex);
}

private Cursor mCursor;

/**
* Creates a ForecastAdapter.
23
*
* @param context Used to talk to the UI and app resources
* @param clickHandler The on-click handler for this adapter. This single handler is
called
* when an item is clicked.
*/
public DoctorListAdapter(@NonNull Context context, ListItemClickListener clickHandler){
mContext = context;
mOnClickListener = clickHandler;

@Override
public DoctorViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType){

View view = LayoutInflater.from(mContext).inflate(R.layout.doctors_list, viewGroup,


false);

view.setFocusable(true);

return new DoctorViewHolder(view);


}

/**
* OnBindViewHolder is called by the RecyclerView to display the data at the specified
* position. In this method, we update the contents of the ViewHolder to display the
weather
* details for this particular position, using the "position" argument that is
conveniently
* passed into us.
*
* @param docviewholder The ViewHolder which should be updated to represent the
* contents of the item at the given position in the data
set.
* @param position The position of the item within the adapter's data
set.
*/

@Override
public void onBindViewHolder(DoctorViewHolder docviewholder, int position) {
mCursor.moveToPosition(position);

DoctorProfile dp = new DoctorProfile(null,null,


null,null,null,null,null);

// icon
String doctorPhoto = dp.getPhoto();

24
//docviewholder.iconView.setText(doctorPhoto);

25
//forecastAdapterViewHolder.iconView.setImageResource(weatherImageId);

// first & last name


String doctorName = dp.getFullName();

docviewholder.nameView.setText(doctorName);

// speciality

String speciality = dp.getSpecs();

docviewholder.descriptionView.setText(speciality);

//stars

Double stars = dp.getStars();


String st = Double.toString(stars);
docviewholder.adressView.setText(st);

//adress
String adress = dp.getAddress();
docviewholder.adressView.setText(adress);

@Override
public int getItemCount() {
if (null == mCursor) return 0;
return mCursor.getCount();
}
/**
* A ViewHolder is a required part of the pattern for RecyclerViews. It mostly behaves as
* a cache of the child views for a forecast item. It's also a convenient place to set an
* OnClickListener, since it has access to the adapter and the views.
*/
class DoctorViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {

final ImageView iconView;

final TextView nameView;


final TextView descriptionView;
final TextView starView;
final TextView adressView;

public DoctorViewHolder(View view){


super(view);

26
iconView = (ImageView) view.findViewById(R.id.doctor_icon);
nameView = (TextView) view.findViewById(R.id.name);
descriptionView = (TextView) view.findViewById(R.id.doctor_description);
starView = (TextView) view.findViewById(R.id.stars);
adressView = (TextView) view.findViewById(R.id.adress);

itemView.setOnClickListener(this);
}

/**
* This gets called by the child views during a click. We fetch the date that has been
* selected, and then call the onClick handler registered with this adapter, passing
that
* date.
*
* @param v the View that was clicked
*/
@Override
public void onClick(View v) {
int clickedPosition = getAdapterPosition();
mOnClickListener.onListItemClick(clickedPosition);
}
}
}

DoctorDetailsActivity
package com.example.vicup.telemedicine;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.vicup.telemedicine.R;

public class DoctorDetailsActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_doctor_details);
}
}

27

S-ar putea să vă placă și

  • PAM Lab 1
    PAM Lab 1
    Document6 pagini
    PAM Lab 1
    Vladislav Crivenco
    Încă nu există evaluări
  • Lab 2 Pam
    Lab 2 Pam
    Document5 pagini
    Lab 2 Pam
    Augusta Bucataru
    Încă nu există evaluări
  • Lab1 Pam
    Lab1 Pam
    Document9 pagini
    Lab1 Pam
    Ion Popescu
    100% (2)
  • AlexeTudorStefan Lab11
    AlexeTudorStefan Lab11
    Document10 pagini
    AlexeTudorStefan Lab11
    Ovidiu Moldovan
    Încă nu există evaluări
  • Lab1 Pam
    Lab1 Pam
    Document9 pagini
    Lab1 Pam
    Ion Popescu
    100% (2)
  • Exemplu Raport
    Exemplu Raport
    Document27 pagini
    Exemplu Raport
    Fil Gorea
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • PAM Lab6
    PAM Lab6
    Document31 pagini
    PAM Lab6
    Ion Cornea
    Încă nu există evaluări
  • Lab 1 Docx
    Lab 1 Docx
    Document6 pagini
    Lab 1 Docx
    AlexandruBotnaru
    Încă nu există evaluări
  • 1 Super Simplu
    1 Super Simplu
    Document8 pagini
    1 Super Simplu
    Ileana Nechita
    Încă nu există evaluări
  • Lab 1 Pam
    Lab 1 Pam
    Document6 pagini
    Lab 1 Pam
    Augusta Bucataru
    Încă nu există evaluări
  • Raport: Lucrarea de Laborator nr.3 Disciplina: Programare În Rețea Tema: Client HTTP
    Raport: Lucrarea de Laborator nr.3 Disciplina: Programare În Rețea Tema: Client HTTP
    Document11 pagini
    Raport: Lucrarea de Laborator nr.3 Disciplina: Programare În Rețea Tema: Client HTTP
    Никита Баранов
    Încă nu există evaluări
  • Caiet de Practica
    Caiet de Practica
    Document6 pagini
    Caiet de Practica
    Pereteatcu Adelina
    Încă nu există evaluări
  • LL2 PAM ECiobanu
    LL2 PAM ECiobanu
    Document19 pagini
    LL2 PAM ECiobanu
    Ecaterina Ciobanu
    Încă nu există evaluări
  • Laborator 4 PR
    Laborator 4 PR
    Document6 pagini
    Laborator 4 PR
    Guzun Ion
    Încă nu există evaluări
  • PAM Lab 2 Rotaru Dan
    PAM Lab 2 Rotaru Dan
    Document17 pagini
    PAM Lab 2 Rotaru Dan
    Dan
    Încă nu există evaluări
  • Laborator 5 - Creare Ferestre (Activități)
    Laborator 5 - Creare Ferestre (Activități)
    Document6 pagini
    Laborator 5 - Creare Ferestre (Activități)
    P. Gucci
    Încă nu există evaluări
  • APOO6
    APOO6
    Document6 pagini
    APOO6
    Akodios
    Încă nu există evaluări
  • Grile Dezvoltare Aplicatii Mobile
    Grile Dezvoltare Aplicatii Mobile
    Document5 pagini
    Grile Dezvoltare Aplicatii Mobile
    Rayzen
    Încă nu există evaluări
  • Lab2 PAM
    Lab2 PAM
    Document12 pagini
    Lab2 PAM
    Ion Popescu
    Încă nu există evaluări
  • Aso LL1
    Aso LL1
    Document6 pagini
    Aso LL1
    Cătălin Cațer
    Încă nu există evaluări
  • Serializare C#
    Serializare C#
    Document23 pagini
    Serializare C#
    Simona Diana
    Încă nu există evaluări
  • Almasan Alexandra - SMA
    Almasan Alexandra - SMA
    Document9 pagini
    Almasan Alexandra - SMA
    Alexandra Almășan
    Încă nu există evaluări
  • Tap Lab5
    Tap Lab5
    Document8 pagini
    Tap Lab5
    Adrian Bodorin
    Încă nu există evaluări
  • Rezultatul Lucrari de Laborator Nr5
    Rezultatul Lucrari de Laborator Nr5
    Document9 pagini
    Rezultatul Lucrari de Laborator Nr5
    Doina Bargan
    Încă nu există evaluări
  • ZinveliuIoana Cumulate Lab8 An1 Sem2
    ZinveliuIoana Cumulate Lab8 An1 Sem2
    Document12 pagini
    ZinveliuIoana Cumulate Lab8 An1 Sem2
    Ioana Zinveliu
    Încă nu există evaluări
  • Damean Alexandra IoT 2
    Damean Alexandra IoT 2
    Document14 pagini
    Damean Alexandra IoT 2
    Damean Alexandra
    Încă nu există evaluări
  • Aplicatii Java FXML Cu Baze de Date
    Aplicatii Java FXML Cu Baze de Date
    Document23 pagini
    Aplicatii Java FXML Cu Baze de Date
    Diana Hartan
    Încă nu există evaluări
  • RGDFHSDTHBGDBF
    RGDFHSDTHBGDBF
    Document6 pagini
    RGDFHSDTHBGDBF
    CS:GO cFG
    Încă nu există evaluări
  • TW Lab4
    TW Lab4
    Document8 pagini
    TW Lab4
    Dan
    Încă nu există evaluări
  • TAP Lab4
    TAP Lab4
    Document10 pagini
    TAP Lab4
    Cristian Batir
    Încă nu există evaluări
  • IDP Laborator 7
    IDP Laborator 7
    Document7 pagini
    IDP Laborator 7
    Fifu One
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Raspunsuri PAM
    Raspunsuri PAM
    Document20 pagini
    Raspunsuri PAM
    Fil Gorea
    Încă nu există evaluări
  • 11.1 Functii Si Proceduri Stocate
    11.1 Functii Si Proceduri Stocate
    Document9 pagini
    11.1 Functii Si Proceduri Stocate
    Husker Dou
    Încă nu există evaluări
  • Laborator2 3
    Laborator2 3
    Document8 pagini
    Laborator2 3
    Molnar Iozsef Bernat
    Încă nu există evaluări
  • Seminar 1
    Seminar 1
    Document48 pagini
    Seminar 1
    Tibi
    Încă nu există evaluări
  • Curs 6
    Curs 6
    Document18 pagini
    Curs 6
    Dan Andrey
    Încă nu există evaluări
  • Documentatie Aplicatie
    Documentatie Aplicatie
    Document12 pagini
    Documentatie Aplicatie
    Iuli Sirbu
    Încă nu există evaluări
  • LAB 4 OOP LunguConstantin
    LAB 4 OOP LunguConstantin
    Document9 pagini
    LAB 4 OOP LunguConstantin
    lungu constantin
    Încă nu există evaluări
  • AJAX Romana
    AJAX Romana
    Document7 pagini
    AJAX Romana
    johhnny83
    Încă nu există evaluări
  • New Microsoft Word Document
    New Microsoft Word Document
    Document26 pagini
    New Microsoft Word Document
    DanuIepuras
    Încă nu există evaluări
  • PAM Lab 1 Rotaru Dan
    PAM Lab 1 Rotaru Dan
    Document3 pagini
    PAM Lab 1 Rotaru Dan
    Dan
    Încă nu există evaluări
  • Utilizarea Internetului in Afaceri Fsega
    Utilizarea Internetului in Afaceri Fsega
    Document20 pagini
    Utilizarea Internetului in Afaceri Fsega
    Florin Drule
    Încă nu există evaluări
  • React
    React
    Document4 pagini
    React
    Raluca Bruma
    Încă nu există evaluări
  • Hgjyujvvgvhgvn
    Hgjyujvvgvhgvn
    Document5 pagini
    Hgjyujvvgvhgvn
    CS:GO cFG
    100% (2)
  • Curs 5
    Curs 5
    Document38 pagini
    Curs 5
    Ionut Bucheru
    Încă nu există evaluări
  • MDlab4 5
    MDlab4 5
    Document13 pagini
    MDlab4 5
    Alexandru Fiodor
    Încă nu există evaluări
  • Curs 4
    Curs 4
    Document23 pagini
    Curs 4
    Gabriela
    Încă nu există evaluări
  • Laborator3 APBDOO Master
    Laborator3 APBDOO Master
    Document4 pagini
    Laborator3 APBDOO Master
    Dorw123
    Încă nu există evaluări
  • Proiect Java
    Proiect Java
    Document8 pagini
    Proiect Java
    corina_maria_ene
    Încă nu există evaluări
  • Laborator 1FX
    Laborator 1FX
    Document14 pagini
    Laborator 1FX
    Bogdan Manciu
    Încă nu există evaluări
  • Manager de Parole C++
    Manager de Parole C++
    Document12 pagini
    Manager de Parole C++
    Gili Chirita
    Încă nu există evaluări
  • Curs BD Insert Delete Update
    Curs BD Insert Delete Update
    Document4 pagini
    Curs BD Insert Delete Update
    Larisa Ionesi
    Încă nu există evaluări
  • Tema 2 - Structura Aplicației Android
    Tema 2 - Structura Aplicației Android
    Document28 pagini
    Tema 2 - Structura Aplicației Android
    Mister Anonim
    Încă nu există evaluări
  • DocumentatieAPIV3-1 3v1
    DocumentatieAPIV3-1 3v1
    Document41 pagini
    DocumentatieAPIV3-1 3v1
    Ana Maria Alexandru
    Încă nu există evaluări
  • LAB1MDMB
    LAB1MDMB
    Document10 pagini
    LAB1MDMB
    NeFe We
    Încă nu există evaluări
  • Tema: Algoritmul de Criptografie RSA: Functionare
    Tema: Algoritmul de Criptografie RSA: Functionare
    Document2 pagini
    Tema: Algoritmul de Criptografie RSA: Functionare
    Ion Popescu
    Încă nu există evaluări
  • Lab 2
    Lab 2
    Document2 pagini
    Lab 2
    Ion Popescu
    Încă nu există evaluări
  • Plia 4 141
    Plia 4 141
    Document55 pagini
    Plia 4 141
    Ion Popescu
    Încă nu există evaluări
  • Plia 7
    Plia 7
    Document53 pagini
    Plia 7
    Ion Popescu
    Încă nu există evaluări
  • Else Fcim Utm MD PDF
    Else Fcim Utm MD PDF
    Document2 pagini
    Else Fcim Utm MD PDF
    Ion Popescu
    Încă nu există evaluări
  • HGJHB
    HGJHB
    Document19 pagini
    HGJHB
    Ion Popescu
    Încă nu există evaluări
  • Lista Subiecte Examen
    Lista Subiecte Examen
    Document1 pagină
    Lista Subiecte Examen
    Ion Popescu
    Încă nu există evaluări
  • Indrumar TAP
    Indrumar TAP
    Document120 pagini
    Indrumar TAP
    Ion Popescu
    Încă nu există evaluări
  • Testarea Software
    Testarea Software
    Document6 pagini
    Testarea Software
    Ion Popescu
    Încă nu există evaluări
  • Lab 7
    Lab 7
    Document8 pagini
    Lab 7
    Ion Popescu
    Încă nu există evaluări