어뎁터
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;
}
}
댓글