본문 바로가기
Android

[Android] 네트워크에서 데이터 가져오기 및 수정 (작성중)

by eyoo 2022. 7. 19.

어뎁터 

 

public class NetworkAdapter extends RecyclerView.Adapter<NetworkAdapter.Viewholder> {

    Context context;
    List<Network> networkList;

    public NetworkAdapter(@NonNull Context context, List<Network> networkList) {
        this.context = context;
        this.networkList = networkList;
    }

    @NonNull
    @Override
    public NetworkAdapter.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.network_row,parent,false);
        return new NetworkAdapter.Viewholder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull NetworkAdapter.Viewholder holder, int position) {
        Network network = networkList.get(position);

        holder.txtName.setText(network.employee_name);
        holder.txtAge.setText("나이 : "+network.employee_age+"세");
        holder.txtSalary.setText("연봉 : $"+network.employee_salary);

    }

    @Override
    public int getItemCount() {
        return networkList.size();
    }

    public class Viewholder extends RecyclerView.ViewHolder{
        TextView txtName;
        TextView txtAge;
        TextView txtSalary;
        ImageView imgClose;
        CardView cardView;

        public Viewholder(@NonNull View itemView) {
            super(itemView);

            txtName = itemView.findViewById(R.id.txtName);
            txtAge = itemView.findViewById(R.id.txtAge);
            txtSalary = itemView.findViewById(R.id.txtSalary);
            cardView = itemView.findViewById(R.id.cardView);
            imgClose = itemView.findViewById(R.id.imgClose);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent = new Intent(context, EditActivity.class);

                    int index = getAdapterPosition();
                    Network network = networkList.get(index);
                    intent.putExtra("network",network);
                    intent.putExtra("index",index);
                    // context.startActivity(intent);
                    ((MainActivity)context).activityResultLauncher.launch(intent);



                }
            });

            imgClose.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });

        }


    }
}

 

메인

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    NetworkAdapter adapter;
    ArrayList<Network> networkList = new ArrayList<Network>();
    ProgressBar progressBar;

    final String URL = "https://block1-image-test.s3.ap-northeast-2.amazonaws.com/employees.json";


    // 내가 실행한 엑티비티로부터 데이터를 다시 받아올때 작성하는 코드
    public ActivityResultLauncher<Intent> activityResultLauncher =
            registerForActivityResult(
                    new ActivityResultContracts.StartActivityForResult(),
                    new ActivityResultCallback<ActivityResult>() {
                        @Override
                        public void onActivityResult(ActivityResult result) {
                            // 받아왔을때 실행되는 코드
                            if(result.getResultCode() == RESULT_OK){
                                int age = result.getData().getIntExtra("age",0);
                                int salary = result.getData().getIntExtra("salary",0);
                                int index = result.getData().getIntExtra("index",0);

                                // 데이터를 저장하고있는 리스트에 해당행에 매칭되는 임플로이 객체를 가져와서 데이터를 수정한다.
                                Network network = networkList.get(index);
                                network.employee_age = age;
                                network.employee_salary = salary;

                                adapter.notifyDataSetChanged();
                            }

                        }
                    });


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

        // 엑션바를 가져오는 방법

        //ActionBar actionBar = getSupportActionBar();

        getSupportActionBar().setTitle(R.string.Employee_Title);


        recyclerView = findViewById(R.id.recyclerView);
        progressBar = findViewById(R.id.progressBar);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

        // 네트워크 데이터를 받아온다.
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, URL,null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // API를 호출한 결과가 여기에 실행됨.

                Log.i("MyEmployee", response.toString());

                try {
                    JSONArray dataList = response.getJSONArray("data");

                    for(int i = 0; i<dataList.length();i++){
                        JSONObject data = dataList.getJSONObject(i);

                        int id = data.getInt("id");
                        String employee_name = data.getString("employee_name");
                        int employee_age = data.getInt("employee_age");
                        int employee_salary = data.getInt("employee_salary");

                        // 클래스의 객체로 만들어서 멤버변수인 리스트에 담아줘야 CPU가 일할수있다.
                        Network network = new Network(id, employee_name,employee_age,employee_salary);
                        networkList.add(network);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    progressBar.setVisibility(View.INVISIBLE);
                    return;
                }

                // 실제 화면에 데이터를 표시하도록 한다.
                adapter = new NetworkAdapter(MainActivity.this,networkList);
                recyclerView.setAdapter((adapter));
                progressBar.setVisibility(View.INVISIBLE);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("MyEmployee", error.toString());
                progressBar.setVisibility(View.INVISIBLE);
            }
        });

        // 실행
        progressBar.setVisibility(View.VISIBLE);
        queue.add(request);



    }
}

 

에디트

public class EditActivity extends AppCompatActivity {

    EditText editAge;
    EditText editSalary;
    Button btnSave;

    int index;

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

        // 엑션바 타이틀 세팅
        getSupportActionBar().setTitle(R.string.title_edit);

        // 엑션바에 백버튼 세팅
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // 데이터 받기
        Network network = (Network)getIntent().getSerializableExtra("network");
        index = getIntent().getIntExtra("index",0);

        editAge = findViewById(R.id.editAge);
        editSalary = findViewById(R.id.editSalary);
        btnSave = findViewById(R.id.btnSave);

        editAge.setText(network.employee_age+"");
        editSalary.setText(network.employee_salary+"");

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String ageStr = editAge.getText().toString().trim();
                String salaryStr = editSalary.getText().toString().trim();

                int age = Integer.valueOf(ageStr).intValue();
                int salary = Integer.valueOf(salaryStr).intValue();

                Intent intent = new Intent();
                intent.putExtra("age",age);
                intent.putExtra("salary",salary);
                // 이두개로는 정보가 부족하다.
                intent.putExtra("index",index);

                setResult(RESULT_OK,intent);
                finish();

            }
        });



    }

    @Override
    public boolean onSupportNavigateUp() {

        // 1. finish를 이용
//        finish();

        // 기계의 백버튼 눌렀을때 호출되는 콜백함수이용
        onBackPressed();
        return true;
    }
}

 

 

 

메인에 리스트를 넣어 사용하지 않고 클래스를 하나 만들고 그란에 리스트 변수를 넣어서 사용

 

Single ton 싱글톤

 

먼저 다른 폴더안에 share 라는 클래스를 만든다.

 

public class Share {

    public ArrayList<Network> networkList;
    private static Share share = null;

    // 다른 클래스에서는 getInstance 함수로만 호출할수있도록 한다.
    public static Share getInstance(){
        if (share == null){
            share = new Share();
        }
        return share;
    }

    private Share(){
        networkList = new ArrayList<>();
    }

}

 

적용:

 

메인

package com.eyoo.networklist;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.eyoo.networklist.adapter.NetworkAdapter;
import com.eyoo.networklist.data.Share;
import com.eyoo.networklist.model.Network;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    NetworkAdapter adapter;
//    ArrayList<Network> networkList = new ArrayList<Network>();  이것을 싱글톤으로 불러오자.
    Share share;

    // onResume함수를 위한 flag
    boolean hasData = false;

    ProgressBar progressBar;

    final String URL = "https://block1-image-test.s3.ap-northeast-2.amazonaws.com/employees.json";

// 싱글톤을 사용하면 필요하지 않다.

    // 내가 실행한 엑티비티로부터 데이터를 다시 받아올때 작성하는 코드
//    public ActivityResultLauncher<Intent> activityResultLauncher =
//            registerForActivityResult(
//                    new ActivityResultContracts.StartActivityForResult(),
//                    new ActivityResultCallback<ActivityResult>() {
//                        @Override
//                        public void onActivityResult(ActivityResult result) {
//                            // 받아왔을때 실행되는 코드
//                            if(result.getResultCode() == RESULT_OK){
//                                int age = result.getData().getIntExtra("age",0);
//                                int salary = result.getData().getIntExtra("salary",0);
//                                int index = result.getData().getIntExtra("index",0);
//
//                                // 데이터를 저장하고있는 리스트에 해당행에 매칭되는 임플로이 객체를 가져와서 데이터를 수정한다.
//                                Network network = networkList.get(index);
//                                network.employee_age = age;
//                                network.employee_salary = salary;
//
//                                adapter.notifyDataSetChanged();
//                            }
//
//                        }
//                    });


    @Override
    protected void onResume() {
        super.onResume();
        if(hasData){
            adapter.notifyDataSetChanged();
        }
    }

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

        // 엑션바를 가져오는 방법

        //ActionBar actionBar = getSupportActionBar();

        getSupportActionBar().setTitle(R.string.Employee_Title);


        recyclerView = findViewById(R.id.recyclerView);
        progressBar = findViewById(R.id.progressBar);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

        share = Share.getInstance();

        // 네트워크 데이터를 받아온다.
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, URL,null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // API를 호출한 결과가 여기에 실행됨.

                Log.i("MyEmployee", response.toString());

                try {
                    JSONArray dataList = response.getJSONArray("data");

                    for(int i = 0; i<dataList.length();i++){
                        JSONObject data = dataList.getJSONObject(i);

                        int id = data.getInt("id");
                        String employee_name = data.getString("employee_name");
                        int employee_age = data.getInt("employee_age");
                        int employee_salary = data.getInt("employee_salary");

                        // 클래스의 객체로 만들어서 멤버변수인 리스트에 담아줘야 CPU가 일할수있다.
                        Network network = new Network(id, employee_name,employee_age,employee_salary);

//                        networkList.add(network);

                        share.networkList.add(network);

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    progressBar.setVisibility(View.INVISIBLE);
                    return;
                }

                // 실제 화면에 데이터를 표시하도록 한다.
                adapter = new NetworkAdapter(MainActivity.this, share.networkList);
                recyclerView.setAdapter((adapter));
                progressBar.setVisibility(View.INVISIBLE);
                hasData = true;

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("MyEmployee", error.toString());
                progressBar.setVisibility(View.INVISIBLE);
            }
        });

        // 실행
        progressBar.setVisibility(View.VISIBLE);
        queue.add(request);



    }
}

어뎁터

package com.eyoo.networklist.adapter;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.eyoo.networklist.EditActivity;
import com.eyoo.networklist.MainActivity;
import com.eyoo.networklist.R;
import com.eyoo.networklist.model.Network;

import java.util.List;

public class NetworkAdapter extends RecyclerView.Adapter<NetworkAdapter.Viewholder> {

    Context context;
    List<Network> networkList;

    public NetworkAdapter(@NonNull Context context, List<Network> networkList) {
        this.context = context;
        this.networkList = networkList;
    }

    @NonNull
    @Override
    public NetworkAdapter.Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.network_row,parent,false);
        return new NetworkAdapter.Viewholder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull NetworkAdapter.Viewholder holder, int position) {
        Network network = networkList.get(position);

        holder.txtName.setText(network.employee_name);
        holder.txtAge.setText("나이 : "+network.employee_age+"세");
        holder.txtSalary.setText("연봉 : $"+network.employee_salary);

    }

    @Override
    public int getItemCount() {
        return networkList.size();
    }

    public class Viewholder extends RecyclerView.ViewHolder{
        TextView txtName;
        TextView txtAge;
        TextView txtSalary;
        ImageView imgClose;
        CardView cardView;

        public Viewholder(@NonNull View itemView) {
            super(itemView);

            txtName = itemView.findViewById(R.id.txtName);
            txtAge = itemView.findViewById(R.id.txtAge);
            txtSalary = itemView.findViewById(R.id.txtSalary);
            cardView = itemView.findViewById(R.id.cardView);
            imgClose = itemView.findViewById(R.id.imgClose);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent = new Intent(context, EditActivity.class);

                    int index = getAdapterPosition();
//                    Network network = networkList.get(index);
//                    intent.putExtra("network",network);
//                    intent.putExtra("index",index);
//                    // context.startActivity(intent);
//                    ((MainActivity)context).activityResultLauncher.launch(intent);

                    intent.putExtra("index",index);
                    context.startActivity(intent);



                }
            });

            imgClose.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });

        }


    }
}

 

에디트

 

 

package com.eyoo.networklist;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.eyoo.networklist.data.Share;
import com.eyoo.networklist.model.Network;

public class EditActivity extends AppCompatActivity {

    EditText editAge;
    EditText editSalary;
    Button btnSave;

    int index;

    Share share;

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

        // 엑션바 타이틀 세팅
        getSupportActionBar().setTitle(R.string.title_edit);

        // 엑션바에 백버튼 세팅
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // 쉐어 클래스는 싱글톤 이기때문에 getInstance함수를 사용하면 한군데만 존재하는 객체를 가져온다.
        Share share = Share.getInstance();

        // 데이터 받기
//        Network network = (Network)getIntent().getSerializableExtra("network");
        index = getIntent().getIntExtra("index",0);

        editAge = findViewById(R.id.editAge);
        editSalary = findViewById(R.id.editSalary);
        btnSave = findViewById(R.id.btnSave);

        // 쉐어클래스에 들어있는 리스트에 직접 엑세스가 가능하니 바로 나이와 연봉정보를 가져와서 보여줄수있다.
        editAge.setText(share.networkList.get(index).employee_age+"");
        editSalary.setText(share.networkList.get(index).employee_salary+"");
//        editSalary.setText(network.employee_salary+""); 원래는 이랬다.

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String ageStr = editAge.getText().toString().trim();
                String salaryStr = editSalary.getText().toString().trim();

                int age = Integer.valueOf(ageStr).intValue();
                int salary = Integer.valueOf(salaryStr).intValue();

                // 바뀐 내용은 바로 쉐어 클래스의 리스트에 직접 저장하고 이 엑티비티는 종료하면 된다.
                share.networkList.get(index).employee_age = age;
                share.networkList.get(index).employee_salary = salary;


//                Intent intent = new Intent();
//                intent.putExtra("age",age);
//                intent.putExtra("salary",salary);
//                // 이두개로는 정보가 부족하다.
//                intent.putExtra("index",index);
//
//                setResult(RESULT_OK,intent);
                finish();

            }
        });



    }

    @Override
    public boolean onSupportNavigateUp() {

        // 1. finish를 이용
//        finish();

        // 기계의 백버튼 눌렀을때 호출되는 콜백함수이용
        onBackPressed();
        return true;
    }
}

댓글