2016-04-23 9 views
2

私はカスタムリストアダプターを持っています。このリストアダプターから、アダプターを設定したアクティビティに値を渡したいと思います。 これは私のアダプタコードです。リストアダプターからアンドロイドの活動にデータを送信するにはどうすればいいですか?

public class RoleList extends ArrayAdapter<String> 
{ 
    private ArrayList<String> name; 
    private ArrayList<String> username; 
    private ArrayList<String> password; 
    private ArrayList<String> role; 
    private Activity context; 

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

    @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) 
      { 
       name.remove(position); 
       username.remove(position); 
       password.remove(position); 
       role.remove(position); 
       callback.onActionPerformed(position); 
       notifyDataSetChanged(); 
      } 
     }); 
     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 MyActionCallback{ 
void onActionPerformed(int position); 
} 
    } 

Nullポインタ例外のログ。

4月23日14:59:16.462 24919から24919/org.bordetuts.com.goldmine E/AndroidRuntime:致命的な例外:メイン4月23日14:59:16.462 24919から24919/org.bordetuts .com.goldmine E/AndroidRuntime:プロセス: org.bordetuts.com.goldmine、PID:24919 04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime: java.lang .NullPointerException 04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime:at org.bordetuts.com.goldmine.adapter.RoleList $ 1.onClick(RoleList.java:67) 04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime: android.view.View.performClick(View.java:4444)04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime: android.view .View $ PerformClick.run(View.java:18440)04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime: android.os.Handler.handleCallback(Handler.java :733)04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime:at android.os.Handler.dispatchMessage(Handler.java:95)04-23 14:59: 16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime: android.os.Looper.loop(Looper.java:136)04-23 14:59:16.462 24919-24919/org.bordetuts。 com.goldmine E/AndroidRuntime: android.app.ActivityThread.main(ActivityThread.java:5028)04から23 14:59:16.462 24919から24919/org.bordetuts.com.goldmine E/AndroidRuntime:java.lang.reflect.Method.invokeNativeで (ネイティブメソッド)04-23 14:59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)04-23 14 :59:16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:788) 04-23 14:59: 16.462 24919-24919/org.bordetuts.com.goldmine E/AndroidRuntime:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)04-23 14:59:16.462 24919-24919/org.bor detuts.com.goldmine E/AndroidRuntime:dalvik.system.NativeStart.mainで (ネイティブメソッド)

私は何かが adapter.For例えば内で変更アクティビティを通知したいと思います。削除が特定の位置で押されました。 提案、ヘルプ、またはポインタが役立ちます。ありがとうございます。

+0

あなたのアクティビティが実装するコールバックを作成し、カスタムアクションで呼び出すことができます。 –

+0

@YuriiTsapご案内のサンプルコードをご提供いただきありがとうございます。 –

答えて

1

あなたの活動:

public class MainActivity extends AppCompatActivity implements YourCustomAdapter.MyActionCallback { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // or something like that 
    ListView listView = findViewById(R.id.my_list_view); 
    listView.setAdapter(new YourCustomAdapter(this)); 
} 



@Override 
public void onActionPerformed(int position) { 
    //do here something with your data 

} 

あなたのアダプタ:

public class YourCustomAdapter extends BaseAdapter { 

public YourCustomAdapter(
     MyActionCallback actionCallback) { 
    mActionCallback = actionCallback; 
} 

private MyActionCallback mActionCallback; 

@Override 
public int getCount() { 
    return 0; 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // your case specific code 
    // don't forget to implement view re-using properly, 
    // don't inflate view each time 
    delete.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
      name.remove(position); 
      username.remove(position); 
      password.remove(position); 
      role.remove(position); 
      //pass position of deleted object or any other thing you want 
      mActionCallback.onActionPerformed(position); 
      notifyDataSetChanged(); 
     } 
    }); 
    return null; 
} 

public interface MyActionCallback{ 
    void onActionPerformed(int position); 
} 

また、あなたは、例えばイベントバス、オットーを使用することができますが、私はあなたのケースのためだけのカスタムコールバックはなると思います十分な。場合によります。

+0

public YourCustomAdapter( MyActionCallback actionCallback){ mActionCallback = actionCallback; }コードのこの部分は何をしていますか? –

+0

これはコールバックで、YourCustomAdapterに渡しています。 MainActivityはMyActionCallbackを実装しているので、アクションを実行した後、このメソッドを呼び出すだけで、MainActivity内の対応する実装がその作業を行います。 –

+0

私はnullポインタexception.please私の更新されたコードを確認します。私の活動では、私は位置を乾杯しようとしていますが、アプリはヌルポインタ例外でクラッシュします。 –

関連する問題