2017-05-08 1 views
0

인터페이스를 사용하여 clickListener를 만드는 방법 ?? 그것은 데이터베이스에서 백그라운드로로드 데이터와 완벽하게 작동합니다. 내가 다른 클래스의 리스너를 만들 때 다음 MapsActivity는 어댑터에서 다른 클래스로의 ClickListener

을 작동하지 않습니다 내 mainActivity :

public class MapsActivity extends FragmentActivity implements LoadAllClubsInterface { 

    private DrawerLayout drawerLayout; 

    private RecyclerView clubRecycler; 
    private RecyclerView.LayoutManager clubLayoutManager; 
    private ArrayList<ClubBean> clubList = new ArrayList<ClubBean>(); 

    private RecyclerView.Adapter clubAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction().replace(R.id.content_frame, new MyMapFragment()).commit(); 

     new LoadAllClubs(this).execute(); //load list in background from database 

     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

     clubRecycler = (RecyclerView) findViewById(R.id.recycler_view); 
     clubRecycler.setHasFixedSize(true); 
     clubLayoutManager = new LinearLayoutManager(this); 

     clubRecycler.setLayoutManager(clubLayoutManager); 

    } 

    @Override 
    public void finishDataLoad(ArrayList<HashMap<String, String>> clubs) { 
     Iterator<HashMap<String, String>> iterator = clubs.iterator(); 
     Map<String, String> map = new HashMap<String, String>(); 
     while (iterator.hasNext()){ 
      map = iterator.next(); 
      clubList.add(new ClubBean(map.get("name"),map.get("localization"), map.get("score"))); 
     } 
     clubAdapter = new ClubAdapter(clubList, this); 
     clubRecycler.setAdapter(clubAdapter); 
    } 


} 

내 어댑터 클래스 :

public class ClubAdapter extends RecyclerView.Adapter<ClubAdapter.MyViewHolder> { 

    private ArrayList<ClubBean> clubList = new ArrayList<ClubBean>(); 
    private OnClubClickListener onClubListClickListener; 
    Context mContext; 

    public ClubAdapter(ArrayList<ClubBean> clubList, Context mContext){ 
     this.clubList = clubList; 
     this.mContext = mContext; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.club_view_item, parent, false); 
     MyViewHolder myHolder = new MyViewHolder(cv); 
     return myHolder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     final ClubBean club = clubList.get(position); 
     CardView cardView = holder.cardView; 
     TextView textClubName = (TextView) cardView.findViewById(R.id.club_name); 
     TextView textClubLoc = (TextView) cardView.findViewById(R.id.club_loc); 
     TextView textClubRating = (TextView) cardView.findViewById(R.id.club_rating); 

     textClubName.setText(club.getClubName()); 
     textClubLoc.setText(club.getClubLoc()); 
     textClubRating.setText(club.getClubRating()); 

     cardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick (View v) { 
       onClubListClickListener.onClicked(club); 
      } 
     }); 
    } 

    public interface OnClubClickListener{ 
     void onClicked(ClubBean club); 
    } 
    public void setOnClickListener(OnClubClickListener onClubListClickListener) { 
     this.onClubListClickListener = onClubListClickListener; 
    } 
    @Override 
    public int getItemCount() { 
     return clubList.size(); 
    } 

    public static class MyViewHolder extends RecyclerView.ViewHolder{ 
     private CardView cardView; 

     public MyViewHolder(CardView v){ 
      super(v); 
      cardView = v; 
     } 
    } 
} 

내지도 조각 :

public class MyMapFragment extends Fragment implements OnMapReadyCallback, ClubAdapter.OnClubClickListener{ 

    GoogleMap mGoogleMap; 
    MapView mMapView; 
    View mView; 

    public MyMapFragment(){ 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     mView = inflater.inflate(R.layout.map_fragment, container, false); 

     return mView; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     mMapView = (MapView) mView.findViewById(R.id.map); 
     if (mMapView != null){ 
      mMapView.onCreate(null); 
      mMapView.onResume(); 
      mMapView.getMapAsync(this); 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     MapsInitializer.initialize(getActivity().getApplicationContext()); 
     mGoogleMap = googleMap; 

     LatLng city = new LatLng(10.4158773,10.6337789); 
     mGoogleMap.addMarker(new MarkerOptions().position(city).title("city")); 
     mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(city, 11)); 
    } 


    @Override 
    public void onClicked (ClubBean club) { 
     ClubBean bean = club; 
     Log.d("Name: ", bean.getClubName()); 
    } 
} 
+0

? Stacktrace를 여기에 입력하십시오. –

+0

java.lang.NullPointerException : null 객체 참조 com.club에서 인터페이스 메소드 'void com.club.clubapp.ClubAdapter $ OnClubClickListener.onClicked (com.club.clubapp.ClubBean)'을 호출하려고 시도했습니다. clubapp.ClubAdapter $ 1.onClick (ClubAdapter.java:47) – Masaj

답변

0

실제로 여기에 약간의 오해가 있습니다. 코드에서 을 만들고 MapsActivity 안에 넣고 OnClubClickListenerMyMapFragment에 구현하면 코드가 작동하지 않습니다. 이 문제를 해결하려면 MapsActivityOnClubClickListener을 구현하거나 RecyclerViewAdapterMyMapFragment으로 변경해야합니다.

그런 다음 Constructor을 사용하여 Adapter에 인터페이스 인스턴스를 전달해야합니다.

MapsActivity

public class MapsActivity extends FragmentActivity implements LoadAllClubsInterface { 

    private DrawerLayout drawerLayout; 

    private RecyclerView clubRecycler; 
    private RecyclerView.LayoutManager clubLayoutManager; 
    private ArrayList<ClubBean> clubList = new ArrayList<ClubBean>(); 

    private RecyclerView.Adapter clubAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction().replace(R.id.content_frame, new MyMapFragment()).commit(); 

     new LoadAllClubs(this).execute(); //load list in background from database 

     drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

     clubRecycler = (RecyclerView) findViewById(R.id.recycler_view); 
     clubRecycler.setHasFixedSize(true); 
     clubLayoutManager = new LinearLayoutManager(this); 

     clubRecycler.setLayoutManager(clubLayoutManager); 

    } 

    @Override 
    public void finishDataLoad(ArrayList<HashMap<String, String>> clubs) { 
     Iterator<HashMap<String, String>> iterator = clubs.iterator(); 
     Map<String, String> map = new HashMap<String, String>(); 
     while (iterator.hasNext()){ 
      map = iterator.next(); 
      clubList.add(new ClubBean(map.get("name"),map.get("localization"), map.get("score"))); 
     } 
     //pass the class that implements your listener as a parameter. 
     clubAdapter = new ClubAdapter(clubList, this, this); 
     clubRecycler.setAdapter(clubAdapter); 
    } 

@Override 
    public void onClicked (ClubBean club) { 
     ClubBean bean = club; 
     Log.d("Name: ", bean.getClubName()); 
    } 

} 

어댑터 클래스 : 무엇을 작동하지

public class ClubAdapter extends RecyclerView.Adapter<ClubAdapter.MyViewHolder> { 

    private ArrayList<ClubBean> clubList = new ArrayList<ClubBean>(); 
    private OnClubClickListener onClubListClickListener; 
    Context mContext; 

    public ClubAdapter(ArrayList<ClubBean> clubList, Context mContext, OnClubClickListener listener){ 
     this.clubList = clubList; 
     this.mContext = mContext; 
     this.onClubListClickListener = listener; 

    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.club_view_item, parent, false); 
     MyViewHolder myHolder = new MyViewHolder(cv); 
     return myHolder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     final ClubBean club = clubList.get(position); 
     CardView cardView = holder.cardView; 
     TextView textClubName = (TextView) cardView.findViewById(R.id.club_name); 
     TextView textClubLoc = (TextView) cardView.findViewById(R.id.club_loc); 
     TextView textClubRating = (TextView) cardView.findViewById(R.id.club_rating); 

     textClubName.setText(club.getClubName()); 
     textClubLoc.setText(club.getClubLoc()); 
     textClubRating.setText(club.getClubRating()); 

     cardView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick (View v) { 
       onClubListClickListener.onClicked(club); 
      } 
     }); 
    } 

    public interface OnClubClickListener{ 
     void onClicked(ClubBean club); 
    } 
    public void setOnClickListener(OnClubClickListener onClubListClickListener) { 
     this.onClubListClickListener = onClubListClickListener; 
    } 
    @Override 
    public int getItemCount() { 
     return clubList.size(); 
    } 

    public static class MyViewHolder extends RecyclerView.ViewHolder{ 
     private CardView cardView; 

     public MyViewHolder(CardView v){ 
      super(v); 
      cardView = v; 
     } 
    } 
} 
+0

내가 메인 액티비티로 인터페이스를 구현하면 움직일 것이다. 내가 클릭 한 개체와지도 조각 클래스에 액세스 할 수 있어야합니다. – Masaj

+0

제목이 잘못되었습니다. – Masaj

+0

괜찮습니다. 다른 질문을 할 것입니다. – Masaj

관련 문제