반응형
이전예제
이번에는 관리자 계정으로 원하는 계정을 검색하는 기능을 추가하는 예제입니다.
- 먼저 admin으로 로그인을 합니다.
- 여기서 MANAGE 버튼을 누릅니다.
- search창에서 aa를 검색해봅시다.
- aa로 검색하면 다음과 같이 aa계정이 검색됩니다. 그후 삭제 버튼을 누르고 다시 사용자 계정 리스트를 보면
- 다음과 같이 aa계정이 삭제됬음을 알 수 있습니다.
activity_management.xml
여기서 검색창으로 사용할 EditText를 추가해줍니다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.kch.proj_manager_v8.ManagementActivity">
<LinearLayout
android:layout_width="368dp"
android:layout_height="495dp"
android:orientation="vertical"
android:background="#d1d1d1"
tools:layout_editor_absoluteY="8dp"
tools:layout_editor_absoluteX="8dp">
<EditText
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="search"
/>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView"
android:layout_marginTop="10dp"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp"
android:dividerHeight="10dp"
android:divider="#d1d1d1">
</ListView>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
ManagementActivity.java
위에서 추가한 EditText 객체를 만들고 리스너를 등록합니다.
package com.example.kch.proj_manager_v8;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.ListView;
import android.content.Intent;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class ManagementActivity extends AppCompatActivity {
private ListView listView;
private UserListAdapter adapter;
private List<User> userList;
private List<User> saveList;//회원검색 기능용 복사본
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_management);
/* TextView userListTextView = (TextView)findViewById(R.id.listView);
//ManagementActivity는 MainActivity에서 호출되므로 호출시 넘겨준 데이터를 뿌려주는 역할을 한다
Intent intent = getIntent();
//intent.putExtra("userList", result); 에서 userList에 저장했으므로 아래와 같이 쓰게됨
userListTextView.setText(intent.getStringExtra("userList"));*/
Intent intent = getIntent();
listView = (ListView)findViewById(R.id.listView);
userList = new ArrayList<User>();
saveList = new ArrayList<User>();
//어댑터 초기화부분 userList와 어댑터를 연결해준다.
//회원 삭제 및 관리자 기능 아래 부분 수정됨
//adapter = new UserListAdapter(getApplicationContext(), userList);
adapter = new UserListAdapter(getApplicationContext(), userList, this, saveList);//로 수정됨
listView.setAdapter(adapter);
try{
//intent로 값을 가져옵니다 이때 JSONObject타입으로 가져옵니다
JSONObject jsonObject = new JSONObject(intent.getStringExtra("userList"));
//List.php 웹페이지에서 response라는 변수명으로 JSON 배열을 만들었음..
JSONArray jsonArray = jsonObject.getJSONArray("response");
int count = 0;
String userID, userPassword, userName, userAge;
//JSON 배열 길이만큼 반복문을 실행
while(count < jsonArray.length()){
//count는 배열의 인덱스를 의미
JSONObject object = jsonArray.getJSONObject(count);
userID = object.getString("userID");//여기서 ID가 대문자임을 유의
userPassword = object.getString("userPassword");
userName = object.getString("userName");
userAge = object.getString("userAge");
//값들을 User클래스에 묶어줍니다
User user = new User(userID, userPassword, userName, userAge);
if(!userID.equals("admin"))//관리자계정은 삭제하지않게 하기위해서 씀
{
userList.add(user);//리스트뷰에 값을 추가해줍니다
saveList.add(user);//여기도 똑같이 값을 추가해줍니다. 회원검색기능용
}
count++;
}
}catch(Exception e){
e.printStackTrace();
}
EditText search = (EditText)findViewById(R.id.search);
search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
searchUser(charSequence.toString());//회원 검색 기능용
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
public void searchUser(String search){
userList.clear();
for(int i = 0; i < saveList.size(); i++){
if(saveList.get(i).getUserID().contains(search)){//contains메소드로 search 값이 있으면 true를 반환함
userList.add(saveList.get(i));
}
}
adapter.notifyDataSetChanged();//어댑터에 값일 바뀐것을 알려줌
}
}
UserListAdapter.java
saveList는 원래 사용자계정 리스트의 원본이고 userList는 실제 리스트뷰로 보여주는 사용자계정 리스트이므로
그점에 유의해서 아래와 같이 구현합니다.
package com.example.kch.proj_manager_v8;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
import java.util.List;
/**
* Created by kch on 2018. 2. 17..
*/
public class UserListAdapter extends BaseAdapter {
private Context context;
private List<User> userList;
private Activity parentActivity;//회원삭제 강의때 추가
private List<User> saveList;
//여기서 Actvitivy parentActivity가 추가됨 회원삭제 및 관리자기능 예제
public UserListAdapter(Context context, List<User> userList, Activity parentActivity, List<User> saveList){
this.context = context;
this.userList = userList;
this.parentActivity = parentActivity;//회원삭제 강의때 추가
this.saveList = saveList;//회원검색 강의때 추가
}
//출력할 총갯수를 설정하는 메소드
@Override
public int getCount() {
return userList.size();
}
//특정한 유저를 반환하는 메소드
@Override
public Object getItem(int i) {
return userList.get(i);
}
//아이템별 아이디를 반환하는 메소드
@Override
public long getItemId(int i) {
return i;
}
//가장 중요한 부분
//int i 에서 final int i 로 바뀜 이유는 deleteButton.setOnClickListener에서 이 값을 참조하기 때문
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
View v = View.inflate(context, R.layout.user, null);
//뷰에 다음 컴포넌트들을 연결시켜줌
//final추가 안붙이면 에러남 리스너로 전달하고 싶은 지역변수는 final로 처리해야됨
final TextView userID = (TextView)v.findViewById(R.id.userID);
TextView userPassword = (TextView)v.findViewById(R.id.userPassword);
TextView userName = (TextView)v.findViewById(R.id.userName);
TextView userAge = (TextView)v.findViewById(R.id.userAge);
userID.setText(userList.get(i).getUserID());
userPassword.setText(userList.get(i).getUserPassword());
userName.setText(userList.get(i).getUserName());
userAge.setText(userList.get(i).getUserAge());
//이렇게하면 findViewWithTag를 쓸 수 있음 없어도 되는 문장임
v.setTag(userList.get(i).getUserID());
//삭제 버튼 객체 생성
Button deleteButton = (Button)v.findViewById(R.id.deleteButton);
deleteButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
//4. 콜백 처리부분(volley 사용을 위한 ResponseListener 구현 부분)
Response.Listener<String> responseListener = new Response.Listener<String>(){
@Override
public void onResponse(String response) {
try{
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean("success");
//받아온 값이 success면 정상적으로 서버로부터 값을 받은 것을 의미함
if(success){
userList.remove(i);//리스트에서 해당부분을 지워줌
//saveList는 찾아서 해줘야됨 이게 기준이기 때문임
for(int i = 0; i < saveList.size(); i++){
if(saveList.get(i).getUserID().equals(userID.getText().toString())){
saveList.remove(i);
break;
}
}
notifyDataSetChanged();//데이터가 변경된 것을 어댑터에 알려줌
}
}
catch(Exception e){
e.printStackTrace();
}
}
};
//volley 사용법
//1. RequestObject를 생성한다. 이때 서버로부터 데이터를 받을 responseListener를 반드시 넘겨준다.
//위에서 userID를 final로 선언해서 아래 처럼 가능함
DeleteRequest deleteRequest = new DeleteRequest(userID.getText().toString(), responseListener);
//2. RequestQueue를 생성한다.
//여기서 UserListAdapter는 Activity에서 상속받은 클래스가 아니므로 Activity값을 생성자로 받아서 사용한다
RequestQueue queue = Volley.newRequestQueue(parentActivity);
//3. RequestQueue에 RequestObject를 넘겨준다.
queue.add(deleteRequest);
}//onclick
});
//만든뷰를 반환함
return v;
}
}
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - 3. 수강신청앱 회원 데이터베이스 구축 (1) | 2018.05.07 |
---|---|
안드로이드 - 2. 수강신청앱 수강신청앱 회원가입 화면 만들기 (0) | 2018.04.28 |
안드로이드 - 1. 수강신청앱 수강신청앱 로그인 화면 만들기 (1) | 2018.04.24 |
안드로이드 - 프로젝트9. 디자인을 예쁘게 꾸미기 (0) | 2018.04.15 |
안드로이드 - 프로젝트7. 회원 삭제 및 관리자 기능 (0) | 2018.04.09 |
안드로이드 - 프로젝트6. 회원목록을 리스트뷰로 출력하기 (1) | 2018.02.17 |
안드로이드 - 프로젝트5. 회원목록 출력하기 (0) | 2018.02.17 |
안드로이드 - 프로젝트4. 로그인 및 메인 화면 구현 (14) | 2017.12.30 |