2016-04-27 1 views
0

Нажатие кнопки Я пытаюсь отправить некоторые данные на свой php-скрипт, используя библиотеку волейбола google. Метод отправки данных находится внутри Activity, и я написал интерфейс для вызова метода из адаптера пользовательского списка .Вызов метода активности из адаптера пользовательского списка в android?

Ниже мой адаптер код:

public class RoleList extends ArrayAdapter<String> { 

    public static final String DELETEUSERINFO = VirtualMachineIp.VMIP_ADDRESS.trim() + "goldmine/getuserinfo.php"; 
    public static final String KEY_NAME = "name"; 
    public static final String KEY_ROLE = "role"; 
    private ArrayList<String> name; 
    private ArrayList<String> username; 
    private ArrayList<String> password; 
    private ArrayList<String> role; 
    private Activity context; 

    public int getPos() { 
     return pos; 
    } 

    public void setPos(int pos) { 
     this.pos = pos; 
    } 

    int pos; 

    public boolean isDelPressed() { 
     return delPressed; 
    } 

    public void setDelPressed(boolean delPressed) { 
     this.delPressed = delPressed; 
    } 

    boolean delPressed; 

    private onDelCallback listener; 

    public RoleList(Activity context, ArrayList<String> name, ArrayList<String> username, ArrayList<String> password, ArrayList<String> role, onDelCallback listener) { 
     super(context, R.layout.role_list, name); 
     this.context = context; 
     this.name = name; 
     this.username = username; 
     this.password = password; 
     this.role = role; 
     this.listener = listener; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     final View listViewItem = inflater.inflate(R.layout.role_list, null, true); 
     final TextView textViewName = (TextView) listViewItem.findViewById(R.id.tv_empname); 
     final TextView textViewusername = (TextView) listViewItem.findViewById(R.id.tv_empusername); 
     final TextView textViewPass = (TextView) listViewItem.findViewById(R.id.tv_emppassword); 
     final TextView textViewRole = (TextView) listViewItem.findViewById(R.id.tv_emprole); 
     Button edit = (Button) listViewItem.findViewById(R.id.btn_editRole); 
     Button delete = (Button) listViewItem.findViewById(R.id.btn_delRole); 


     delete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       setDelPressed(true); 
       name.remove(position); 
       username.remove(position); 
       password.remove(position); 
       role.remove(position); 
       listener.deleteuser(position); 
       notifyDataSetChanged(); 
       setPos(position); 

      } 
     }); 
     edit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("Emp Info", name.get(position) + " " + username.get(position) + " " + password.get(position) + " " + role.get(position)); 

       final Dialog dialog = new Dialog(getContext()); 
       dialog.setContentView(R.layout.userreg); 
       dialog.setTitle("Edit Employee " + name.get(position) + " details"); 
       final String[] arraySpinner = new String[]{"Manager", "Stockist", "Cashier", "Accountant"}; 
       dialog.setCancelable(false); 
       dialog.setCanceledOnTouchOutside(false); 
       final EditText emp_name = (EditText) dialog.findViewById(R.id.editTextName); 
       final EditText emp_uname = (EditText) dialog.findViewById(R.id.editTextUserName); 
       final EditText emp_pw = (EditText) dialog.findViewById(R.id.editTextPassword); 
       final Spinner emp_role = (Spinner) dialog.findViewById(R.id.spinner_role); 
       final TextView textRole = (TextView) dialog.findViewById(R.id.tv_selected_role); 
       ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, arraySpinner); 
       emp_role.setAdapter(adapter); 
       emp_role.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
        @Override 
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
         Toast.makeText(getContext(), "Role Selected is " + arraySpinner[position], Toast.LENGTH_SHORT).show(); 

         String employee_role = arraySpinner[position]; 
         textRole.setText(employee_role); 

        } 

        @Override 
        public void onNothingSelected(AdapterView<?> parent) { 

        } 
       }); 


       emp_name.setText(name.get(position)); 
       emp_uname.setText(username.get(position)); 
       emp_pw.setText(password.get(position)); 
       emp_role.setSelection(position); 

       Button buttoncancel = (Button) dialog.findViewById(R.id.buttonCancel); 
       buttoncancel.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialog.dismiss(); 
        } 
       }); 

       Button buttonChange = (Button) dialog.findViewById(R.id.buttonRegister); 
       buttonChange.setText("Change"); 
       buttonChange.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         textViewName.setText(emp_name.getText().toString()); 
         textViewusername.setText(emp_uname.getText().toString()); 
         textViewPass.setText(emp_pw.getText().toString()); 
         textViewRole.setText(textRole.getText()); 
         dialog.dismiss(); 

        } 
       }); 


       dialog.show(); 
      } 
     }); 


     textViewName.setText(name.get(position)); 
     textViewusername.setText(username.get(position)); 
     textViewPass.setText(password.get(position)); 
     textViewRole.setText(role.get(position)); 

     return listViewItem; 
    } 

    public interface onDelCallback { 
     void deleteuser(int pos); 
    } 



} 

Следующий код должен идеально получить вызывается при нажатии кнопки в списке:

@Override 
    public void deleteuser(final int pos) 
    { 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, DELETEUSERINFO, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) 
      { 
       String resp = response.toString().trim(); 
       if (resp.equals("UNABLE TO DELETE USER")) 
       { 
        Log.d("UNABLE TO DEL",resp); 
       }else if (resp.equals("USER DELETED SUCCESSFULLY")) 
       { 
        Toast.makeText(UserRegistration.this, "USER DELETED SUCCESSFULLY", Toast.LENGTH_SHORT).show(); 
       } 

      } 
     }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

         Toast.makeText(UserRegistration.this, "Please check your internet connection", Toast.LENGTH_LONG).show(); 
        } 
       }){ 

      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       Map<String, String> params = new HashMap<>(); 
       params.put(KEY_NAME, employee_name.get(pos)); 
       params.put(KEY_ROLE,employee_role.get(pos)); 
       return params; 
      } 
     }; 
     RequestQueue rq = Volley.newRequestQueue(this); 
     rq.add(stringRequest); 
    } 

Я установил адаптер внутри parseUserinfo(), который работает от ответа getUserinfo(), который я вызываю внутри onCreate().getUserinfo(), используется для запроса данных с удаленного сервера.

Это, как я установить адаптер:

RoleList roleList = new RoleList(UserRegistration.this, employee_name, emp_username, emp_password, employee_role,UserRegistration.this); 
userList.setAdapter(roleList); 

Я хочу знать, если я звоню адаптер в нужном месте. Нужно ли мне снова позвонить?

Любая помощь или предложение оценены. Спасибо.

+1

Что является актуальной проблемой вы столкнулись? –

+0

Проблема в том, что метод, который я пытаюсь выполнить, не вызван. Так что я хотел бы знать, нужно ли мне снова установить адаптер или я вызываю метод в неправильном месте. – AndroidNewBee

+0

Сообщите вам полный код адаптера. –

ответ

0

Есть определенные способы, с помощью которых и можно вызывать ваш метод активности от адаптера:

  1. когда и создать конструктор адаптера в то время вы можете передать свой объект деятельности по своим параметрам, а затем использовать этот объект в вашем адаптере.

  2. Если вы создаете интерфейс в адаптере, вы должны реализовать этот интерфейс в своем соответствующем действии, а затем вы можете передать свой объект активности через конструктор адаптера и можете использовать ваш необходимый метод.

+0

Да Tejas Я использую интерфейс, но не могу понять, почему мой метод активности не вызван? – AndroidNewBee

+0

В вашем адаптере вы видите контекст активности, вместо использования которого необходимо передать ссылку на конкретное действие для ex, если ваше имя активности - это MyActivity, тогда использование должно передать значение MyActivity refrence –

0

общественного RoleList (контекст деятельности, имя ArrayList, ArrayList имя пользователя, ArrayList пароль, ArrayList роль, onDelCallback слушатель) {} В приведенном выше конструктору и должно передать соответствующий объект Activity, например MyActvity mActivity, а затем прохождения общий объект Activity. Поскольку я надеюсь, что ваш метод доступен в классе MyActvity, а также учитывая, что вы реализовали интерфейс в классе MyActvity.

0

Вы можете выполнить вашу задачу удаления вашей деятельности в адаптере как этот

delete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       UserRegistration act = (UserRegistration) context; 
       act.deleteuser(position); 
      } 
     }); 
+0

Такой подход не является предпочтительным, поскольку он вводит плотная связь между UserRegistration и адаптером –

 Смежные вопросы

  • Нет связанных вопросов^_^