代码之家  ›  专栏  ›  技术社区  ›  JED

onclicklistener无法从导航抽屉中的片段工作

  •  -2
  • JED  · 技术社区  · 7 年前

    我不知道我做错了什么。我设置了一个导航抽屉,当我单击导航抽屉中的一个项目时,它会加载一个列表视图片段,我用适配器自定义了该片段。这部分有效。

    这是我的密码。

    package org.nctta.nctta_tournaments.fragments;
    
    import android.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import android.widget.AdapterView;
    
    import org.nctta.nctta_tournaments.R;
    import org.nctta.nctta_tournaments.Tournament;
    import org.nctta.nctta_tournaments.TournamentAdapter;
    
    import java.util.ArrayList;
    
    /**
     * Created by John on 9/10/2017.
     */
    
    public class EventsFragment extends Fragment {
    
    public EventsFragment() {
        //Required empty public constructor
    }
    
    View myView;
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.events_layout, container,false);
    
        //create a list of tournaments for testing
        final ArrayList<Tournament> Tournaments = new ArrayList<Tournament>();
            Tournaments.add(new Tournament("1","Ohio East Fall Tournament","1/1/2017", "1/1/2017","University of Akron"));
            Tournaments.add(new Tournament("2","Ohio West Fall Tournament","1/1/2017", "1/1/2017","Ohio State University"));
            Tournaments.add(new Tournament("3","Upper Midwest Fall Tournament","1/1/2017", "1/1/2017","University of Iowa"));
            Tournaments.add(new Tournament("4","Central Plains Fall Tournament","1/1/2017", "1/1/2017","Univeristy of Centeral Plains"));
            Tournaments.add(new Tournament("5","Lower Midwest Fall Tournament","1/1/2017", "1/1/2017","Lindenwood University"));
            Tournaments.add(new Tournament("6","Midwest Regional Tournament","1/1/2017", "1/1/2017","Lindenwood University"));
            Tournaments.add(new Tournament("7","Great Lakes Regional Tournament","1/1/2017", "1/1/2017","Lindenwood University"));
            Tournaments.add(new Tournament("8","South Regional Tournament","1/1/2017", "1/1/2017","Lindenwood University"));
    
        //Create an Tournament Adapter
        TournamentAdapter adapter = new TournamentAdapter(getActivity(),Tournaments);
    
        //find the listview object in the view hierarchy
        ListView listView = (ListView) myView.findViewById(R.id.tourList);
        listView.setAdapter(adapter);
    
        //set a click listener to open tournament info page
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l){
                //get the tournament object at the given position the user clicked on
                Tournament tournament = Tournaments.get(position);
                //start tournamentactivity
                android.app.FragmentManager fragmentManager = getFragmentManager();
    
                fragmentManager.beginTransaction()
                            .replace(R.id.content_frame, new TournamentFragment())
                            .commit();
            }
        });
        return myView;
    }
    }
    

    package org.nctta.nctta_tournaments.fragments;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.view.ViewPager;
    import android.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import org.nctta.nctta_tournaments.R;
    
    /**
     * Created by John on 9/15/2017.
     */
    
    public class TournamentFragment extends Fragment {
    View myView;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.tournament_tabs, container,false);
    /*
        //Find the view pager that will allow the user to swipe between fragments
        ViewPager viewPager = (ViewPager) myView.findViewById(R.id.viewpager);
        //create an adapter that knows which fragment should be shown on each page
        TournTabsAdapter adapter = new TournTabsAdapter(this, getChildFragmentManager());
        //set the adapter onto the view pager
        viewPager.setAdapter(adapter);
        //find the tab layout that shows the tabs
        TabLayout tabLayout = (TabLayout) myView.findViewById(R.id.tabs);
        // Connect the tab layout with the view pager. This will
        //   1. Update the tab layout when the view pager is swiped
        //   2. Update the view pager when a tab is selected
        //   3. Set the tab layout's tab names with the view pager's adapter's titles
        //      by calling onPageTitle()
        tabLayout.setupWithViewPager(viewPager);
    */
        return myView;
    }
    

    有什么想法吗??

    1 回复  |  直到 7 年前
        1
  •  0
  •   JED    7 年前

    点击监听器项无法工作的主要原因是我的列表视图自定义适配器包含一个imagebuttom。我最终做的是删除该侦听器并在适配器内添加onclicklisteners。关键是利用settag。

    package org.nctta.nctta_tournaments;
    
    /**
     * Created by John on 9/15/2017.
     */
    
    import android.app.Activity;
    import android.app.FragmentManager;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.content.Context;
    import android.widget.ImageButton;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import org.nctta.nctta_tournaments.fragments.TournamentFragment;
    
    import java.util.ArrayList;
    
    public class TournamentAdapter extends ArrayAdapter<Tournament> {
    
    //create a new TournamentAdapter object.
    public TournamentAdapter(Context context, ArrayList<Tournament> tournaments) {
        super(context, 0 , tournaments);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //check if an existing view is being reuse, otherwise inflate the view
        View listItemView = convertView;
        if (listItemView ==null) {
            listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.tournament_list_item, parent, false);
        }
        //get the current tournament object at this position in the list
        Tournament currentTournament = getItem(position);
    
        //Find the TExtView in the tournament_list_item.xml layout with iD of name
        TextView TourName = (TextView) listItemView.findViewById(R.id.Name);
        //get/set the tournament name of the current tournament object
        TourName.setText(currentTournament.getTournamentName());
        //Find the TextView in the tournament_list_item.xml layout with ID of Location
        TextView TourLocation = (TextView) listItemView.findViewById(R.id.Location);
        //get/set the tournament location of the current tournament object;
        TourLocation.setText(currentTournament.getTournamentLocation());
        //Find the linearlayout with id of text_container
        LinearLayout textArea = (LinearLayout) listItemView.findViewById(R.id.text_container);
        textArea.setTag(currentTournament.getTournamentName());
        //Find map view button with id of imageButton
        ImageButton mapButton = (ImageButton) listItemView.findViewById(R.id.imageButton);
        mapButton.setTag(currentTournament.getTournamentName());
        final Context context = parent.getContext();
        final FragmentManager fm = ((Activity) context).getFragmentManager();
        //set onclicklisteners
        textArea.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = v.getTag().toString();
                Toast.makeText(getContext(),str + "TEXT", Toast.LENGTH_SHORT).show();
                //start tournament fragment
    
                fm.beginTransaction()
                        .replace(R.id.content_frame, new TournamentFragment())
                        .commit();
            }
        });
        mapButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = v.getTag().toString();
                Toast.makeText(getContext(),str + "MAP", Toast.LENGTH_SHORT).show();
            }
        });
    
        return listItemView;
    }
    }