首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从适配器到其他类的ClickListener

从适配器到其他类的ClickListener
EN

Stack Overflow用户
提问于 2017-05-08 19:11:51
回答 1查看 64关注 0票数 0

如何使用接口创建clickListener?它能很好地处理数据库背景下的加载数据。但是当我想在其他类中创建侦听器时,MapsActivity就不能工作了。

我的mainActivity:

代码语言:javascript
复制
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);
    }


}

我的适配器类:

代码语言:javascript
复制
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;
        }
    }
}

我的地图片段

代码语言:javascript
复制
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());
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-08 19:23:52

其实这里有一些误解。在您的代码中,您要在您的RecyclerView中创建和填充一个MapsActivity,并且在您的MyMapFragment中实现您的OnClubClickListener,所以这是行不通的。要解决这个问题,您必须在OnClubClickListener中实现MapsActivity,或者将RecyclerViewAdapter的创建更改为MyMapFragment

完成之后,您必须使用Adapter将接口的实例传递给您的Constructor

MapsActivity

代码语言:javascript
复制
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());
    }

}

您的适配器类:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43855527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档