Android 导航抽屉回收器查看项目单击活动
我创建了一个导航抽屉,里面有一个RecyclerView。这是我从YouTube上学到的。但是,我很难为它实现“onNavigationDrawerItemSelected”方法。我想做的是让用户能够单击列表中的项目,并将它们导航到一个活动,而不是一个片段 我是android编程新手,因此我对代码理解不好。我在网上的教程上到处都找过,比如下面的链接,但都不起作用。我花了很多时间试图弄明白这一点,我得到的只是应用程序崩溃,不得不重新启动整个程序。如果有人能在这方面帮助我,那对我来说意义重大 以下是我为主要活动、NavigationDrawer和NavigationDrawerRadapter制作的代码 导航抽屉碎片:Android 导航抽屉回收器查看项目单击活动,android,android-fragments,android-recyclerview,navigation-drawer,onclicklistener,Android,Android Fragments,Android Recyclerview,Navigation Drawer,Onclicklistener,我创建了一个导航抽屉,里面有一个RecyclerView。这是我从YouTube上学到的。但是,我很难为它实现“onNavigationDrawerItemSelected”方法。我想做的是让用户能够单击列表中的项目,并将它们导航到一个活动,而不是一个片段 我是android编程新手,因此我对代码理解不好。我在网上的教程上到处都找过,比如下面的链接,但都不起作用。我花了很多时间试图弄明白这一点,我得到的只是应用程序崩溃,不得不重新启动整个程序。如果有人能在这方面帮助我,那对我来说意义重大
public class NavigationDrawerFragment extends Fragment {
private RecyclerView recyclerView;
public static final String PREF_FILE_NAME = "testpref";
public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer";
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private NavigationDrawerAdapter adapter;
/*This is to tell the User that there is a navigation drawer*/
private boolean mUserLearnedDrawer;
private boolean mFromSavedInstanceState;
private View containerView;
public NavigationDrawerFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
if (savedInstanceState != null) {
mFromSavedInstanceState = true;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
recyclerView = (RecyclerView) layout.findViewById(R.id.navigation_drawer_list);
adapter = new NavigationDrawerAdapter(getActivity(), getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return layout;
}
//Change the Drawables and Text Here for the NavigationDrawer List Items
public static List<NavigationDrawerItems> getData() {
List<NavigationDrawerItems> data = new ArrayList<>();
int[] icons = {R.drawable.ic_account_circle_black_36dp, R.drawable.ic_home_black_36dp, R.drawable.ic_language_black_36dp, R.drawable.ic_redeem_black_36dp, R.drawable.ic_settings_black_36dp};
String[] titles = {"Restaurants", "Categories", "Planner", "About Us", "Settings"};
for (int i = 0; i < titles.length && i < icons.length; i++) {
NavigationDrawerItems current = new NavigationDrawerItems();
current.iconId = icons[i];
current.title = titles[i];
data.add(current);
}
return data;
}
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
containerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!mUserLearnedDrawer) {
mUserLearnedDrawer = true;
saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer + "");
}
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
getActivity().invalidateOptionsMenu();
}
};
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(containerView);
}
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
}
public static void saveToPreferences(Context context, String preferenceName, String preferenceValue) {
SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(preferenceName, preferenceValue);
editor.apply();
}
public static String readFromPreferences(Context context, String preferenceName, String defaultValue) {
SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
return sharedPreferences.getString(preferenceName, defaultValue);
}
}
导航雷达:
public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {
private LayoutInflater inflater;
List<NavigationDrawerItems> data = Collections.emptyList();
public NavigationDrawerAdapter(Context context, List<NavigationDrawerItems> data) {
inflater = LayoutInflater.from(context);
this.data = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.fragment_navigation_drawer_row, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
NavigationDrawerItems current = data.get(position);
holder.title.setText(current.title);
holder.icon.setImageResource(current.iconId);
}
@Override
public int getItemCount() {
return data.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView icon;
public MyViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.navigation_drawer_list_text);
icon = (ImageView) itemView.findViewById(R.id.navigation_drawer_list_icon);
}
}
}
公共类NavigationDrawerDatapter扩展了RecyclerView.Adapter{
私人充气机;
List data=Collections.emptyList();
公共导航抽屉编辑器(上下文、列表数据){
充气器=充气器。从(上下文);
这个数据=数据;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=充气机。充气(R.layout.fragment\u navigation\u drawer\u row,parent,false);
MyViewHolder=新的MyViewHolder(视图);
报税表持有人;
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
NavigationDrawerItems当前=data.get(位置);
holder.title.setText(当前.title);
holder.icon.setImageResource(当前.iconId);
}
@凌驾
public int getItemCount(){
返回data.size();
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
文本视图标题;
图像视图图标;
公共MyViewHolder(查看项目视图){
超级(项目视图);
title=(TextView)itemView.findViewById(R.id.navigation\u drawer\u list\u text);
icon=(ImageView)itemView.findViewById(R.id.navigation\u drawer\u list\u图标);
}
}
}
在适配器类中尝试以下操作:
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView icon;
public MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnCLickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, YourActivity.class);
context.startActivity(intent)
}
});
itemView.findViewById(R.id.navigation_drawer_list_text);
icon = (ImageView) itemView.findViewById(R.id.navigation_drawer_list_icon);
}
}
您必须有一个对上下文变量的引用,您可以拥有它,您可以通过在适配器类的构造函数中赋值来获得它
希望这有帮助 在NavigationDrawerRadapter类中
您需要实现GestureDetector方法来检测项目的位置。
您可以通过编写以下代码来实现这一点
final GestureDetector mGestureDetector = new GestureDetector(YOUR_ACTIVITY_NAME.this, new GestureDetector.SimpleOnGestureListener() {
@Override public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
然后可以实现addOnItemTouchListener,如:
mRecyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
View child = recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY());
if(child!=null && mGestureDetector.onTouchEvent(motionEvent)){
Drawer.closeDrawers();
Toast.makeText(Scnd.this,"The Item Clicked is: "+recyclerView.getChildPosition(child),Toast.LENGTH_SHORT).show();
int p= recyclerView.getChildPosition(child);
if (p == 0){
Intent intent = new Intent(this, FirstActivity.class);
startActivity(intent);
} else if(p == 1){
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
else if(p == 2){
Intent mintent = new Intent(your_activity.this,to activity you want start.class);
startActivity(mintent);
}
child.setBackgroundColor(Color.WHITE);
return true;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
});
现在您可以检查位置2,活动将开始,而不是片段。
这个代码对我来说非常有用。。任何人都可以从中获得帮助。尝试在适配器内设置onclick…您应该使用基本活动概念
mRecyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
View child = recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY());
if(child!=null && mGestureDetector.onTouchEvent(motionEvent)){
Drawer.closeDrawers();
Toast.makeText(Scnd.this,"The Item Clicked is: "+recyclerView.getChildPosition(child),Toast.LENGTH_SHORT).show();
int p= recyclerView.getChildPosition(child);
if (p == 0){
Intent intent = new Intent(this, FirstActivity.class);
startActivity(intent);
} else if(p == 1){
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
else if(p == 2){
Intent mintent = new Intent(your_activity.this,to activity you want start.class);
startActivity(mintent);
}
child.setBackgroundColor(Color.WHITE);
return true;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
});