onclicklistener不工作从导航抽屉里的片段
问题描述:
我无法弄清楚我做错了什么。我有一个导航抽屉的设置,当我点击导航抽屉中的其中一个项目时,它会加载我使用适配器自定义的列表视图的一个片段。那部分工作。onclicklistener不工作从导航抽屉里的片段
但我在该片段内添加了一个onclicklistener,点击时我想加载一个新片段。但是当我点击列表视图中的项目时,什么都不会发生。 这是我的代码。
这是EventsFragment.java,这是加载自定义列表视图。
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;
}
}
这里是我的TournamentFragment,当一个项目被点击时应该加载。这个片段我想加载页面浏览器与标签,我无法去工作,所以现在我评论了这些东西。只是想让clicklistener先工作。
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;
}
}
任何想法?
答
好的评论和一些谷歌搜索帮助我想出了如何让onclicklistener工作...不知道为什么我的帖子downvoted ... 单击监听器项目没有工作的主要原因是因为我的列表视图的自定义适配器包含一个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;
}
}
+0
你可以做的改进之处是使用回调接口,所以它不会在适配器内执行片段事务 – joao86
这是onItemClickListener调用吗?把一个日志调用在那里,看看它是否被称为 – joao86
我通过在那里的吐司消息,当我调试它永远不会被触发 – JED
因此,显然它是听众不工作。那么尝试添加onclick事件到你的适配器 – joao86