프로그래밍/안드로이드

안드로이드 - 프로젝트8. 회원 검색 기능 추가

가카리 2018. 4. 13. 23:05
반응형



이전예제 


이번에는 관리자 계정으로 원하는 계정을 검색하는 기능을 추가하는 예제입니다.


  1. 먼저 admin으로 로그인을 합니다.



  1. 여기서 MANAGE 버튼을 누릅니다.




  1. search창에서 aa를 검색해봅시다.




  1. aa로 검색하면 다음과 같이 aa계정이 검색됩니다. 그후 삭제 버튼을 누르고 다시 사용자 계정 리스트를 보면



  1. 다음과 같이 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"

    xmlns:tools="http://schemas.android.com/tools"

    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;

    }

}