>source

카드 레이아웃이있는 viewpager를 가지고 있으며 사용자가 클릭하여 특정 acvity를 여는 페이지의 위치를 ​​보내려고합니다. 어댑터 클래스에서 내 활동으로 위치를 보내려고하지만널 포인터 예외 오류

가 나타납니다.

이 코드에서 핸들러와 커스텀 인터페이스를 사용해 보았습니다.

내 커스텀 인터페이스

package com.example.authentication.Interface;
public interface MyCustomInterface {
    public void sendData (int pos);
}

활동의 내 sendData 함수

@Override
public void sendData(final int pos) {
    Log.i("TAG", String.valueOf(pos));
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            switch (pos) {
                case 0:
                    intent.putExtra("Code", "MN");
                    startActivity(intent);
                    break;
                case 1:
                    intent.putExtra("Code", "MN");
                    startActivity(intent);
                    break;
                case 2:
                    intent.putExtra("Code", "MN");
                    startActivity(intent);
                    break;
                case 3:
                    intent.putExtra("Code", "MN");
                    startActivity(intent);
                    break;
            }
        }
    });
}

내 어댑터 클래스 onClickListener

view.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            //this will log the page number that was click
            Log.i("TAG", "This page was clicked: " + position);
            myCustomInterface.sendData(position);
        }
    });

오류

java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.authentication.Interface.MyCustomInterface.sendData(java.lang.String)' on a null object reference at com.example.authentication.ListAdapter$1.onClick(ListAdapter.java:63)


  • 답변 # 1

    어댑터 클래스에서 다음을 추가하십시오 :

    private MyCustomInterface mCustomInterface;
    
    

    그런 다음 어댑터 클래스의 adpater 생성자에서 :

    public MyAdapter(Context context,ArrayList<SomeData> data, mCustomInterface) {
    this.context=context;    
    this.mCustomInterface= mCustomInterface;
    this.dataSet = data;
    }
    
    

    그런 다음 어댑터의 인스턴스를 만들 때 활동 클래스에서 :

    MyAdapter mAdapter= new MyAdapter(context,data, new MyCustomInterface() {
                    @Override
                    public void sendData (int position) {
                       //do whatever you want here  
                    }
                });
    
    

    도움이 되길 바랍니다!

  • 답변 # 2

    활동의 인터페이스를 구현합니다

    생성자를 사용하여 인터페이스 객체를 어댑터에 전달합니다.

    MyAdapter adapter = 새로운 MyAdapter (MainActivity.this, list, this);

    이제 어댑터 클래스 Ahmad이 위에서 설명한대로 생성자를 사용하십시오. 공개 MyAdapter (컨텍스트 ctx, List<>list, MyCustomInterface 인터페이스) {

    }

    3. 리스너 객체를 사용하여 인터페이스 함수 호출 interface.sendData (position);

  • 답변 # 3

    뷰 페이저가 있고 클릭 한 위치를 다른 액티비티로 보내려고합니다. 이 방법으로 SharedPreferences 를 사용할 수 있습니다  이 방법으로 공유 환경 설정에 위치를 저장하고 나중에 sendData add의 모든 활동에서 위치를 사용합니다.

    SharedPreferences pref;
          switch (pos) {
                    case 0: 
                pref=getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor=pref.edit();
                editor.putInt("POS",0);
                editor.commit();
                        intent.putExtra("Code", "MN");
                        startActivity(intent);
                        break;
                    case 1:
                pref=getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor=pref.edit();
                editor.putInt("POS",1);
                editor.commit();
                        intent.putExtra("Code", "MN");
                        startActivity(intent);
                        break;
                    case 2:
                pref=getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor=pref.edit();
                editor.putInt("POS",0);
                editor.commit();
                        intent.putExtra("Code", "MN");
                        startActivity(intent);
                        break;
                    case 3:
                pref=getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor=pref.edit();
                editor.putInt("POS",0);
                editor.commit();
                        intent.putExtra("Code", "MN");
                        startActivity(intent);
                        break;
                }
    
    

    그리고 다음 활동을 추가하려는 경우 :

           SharedPreferences prefs=getContext().getSharedPreferences("MyPrefs", 
                Context.MODE_PRIVATE);
            int i=prefs.getInt("POS",1);
    
    

    하지만 'i'를 사용하고 싶지만 ...

관련 자료

  • 이전 reactjs - 모든 어린이들에게 상태를 전달하는 방법을 기본적으로 반응
  • 다음 git - 실수로 Google 키가 포함 된 env 파일을 github에 업로드했지만 파일을 편집하고 키를 제거했습니다 변화가 어딘가에 보일 수 있습니까?