如何在MainActivity中实现导航活动和Recyclerview

时间:2017-12-27 09:04:05

标签: java android

我开始使用导航抽屉活动,然后我将一个recyclerView添加到content_main.xml中,但我无法将RecyclerView实现到ManiActivity.java文件中。

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_camera) {
        // Handle the camera action
    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
}

当我不仅实现了NavigationView Activity时,这就是我的MainAcitity.java。

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {

MyRecyclerViewAdapter adapter;

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

    // data to populate the RecyclerView with
    ArrayList<String> animalNames = new ArrayList<>();
    animalNames.add("Horse");
    animalNames.add("Cow");
    animalNames.add("Camel");
    animalNames.add("Sheep");
    animalNames.add("Goat");

    // set up the RecyclerView
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvAnimals);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new MyRecyclerViewAdapter(this, animalNames);
    adapter.setClickListener(this);
    recyclerView.setAdapter(adapter);
}

@Override
public void onItemClick(View view, int position) {
    Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
}
}

我还需要这个(recyclerview)进入我的MainActivity.java,两者都没有空间

下面这段代码是我的适配器类,整个过程就是将它添加到MainActivity.java

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

private List<String> mData = Collections.emptyList();
private LayoutInflater mInflater;
private ItemClickListener mClickListener;

// data is passed into the constructor
public MyRecyclerViewAdapter(Context context, List<String> data) {
    this.mInflater = LayoutInflater.from(context);
    this.mData = data;
}

// inflates the row layout from xml when needed
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.recyclerview_row, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
}

// binds the data to the textview in each row
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    String animal = mData.get(position);
    holder.myTextView.setText(animal);
}

// total number of rows
@Override
public int getItemCount() {
    return mData.size();
}


// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public TextView myTextView;

    public ViewHolder(View itemView) {
        super(itemView);
        myTextView = (TextView) itemView.findViewById(R.id.tvAnimalName);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
    }
}

// convenience method for getting data at click position
public String getItem(int id) {
    return mData.get(id);
}

// allows clicks events to be caught
public void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
}

}

3 个答案:

答案 0 :(得分:2)

您需要在MainActivity类上实现NavigationView.OnNavigationItemSelectedListener和MyRecyclerViewAdapter.ItemClickListener接口。这样您就可以为Recycler视图调用适配器类。您的代码应如下所示:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, MyRecyclerViewAdapter.ItemClickListener {

  MyRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

// data to populate the RecyclerView with
ArrayList<String> animalNames = new ArrayList<>();
animalNames.add("Horse");
animalNames.add("Cow");
animalNames.add("Camel");
animalNames.add("Sheep");
animalNames.add("Goat");

// set up the RecyclerView
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvAnimals);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyRecyclerViewAdapter(this, animalNames);
adapter.setClickListener(this);
recyclerView.setAdapter(adapter);

}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_camera) {
        // Handle the camera action
    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}  

@Override
public void onItemClick(View view, int position) {
    Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
 }
}

在Java中,一个类可以实现多个接口,而一个类只能从一个父接口扩展。多个接口的实现消除了Java中不允许的多重继承。

例如: ClassA实现了ClassB,ClassC

您可以找到已编辑的代码here

答案 1 :(得分:0)

问题似乎与Adapter类有关。我想看看你的适配器代码。 1.确保count不等于零。 2.确保在适配器类中膨胀正确的视图。 3.您正在膨胀的视图必须具有外部布局“相对”或“线性”或“约束”。

答案 2 :(得分:0)

    public class HomeActivity extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener{

        TabLayout tabLayout;
        ViewPager viewPager;
        NavigationView navigationView;
        View navHeaderView;

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

      Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
      setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                        this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
                drawer.setDrawerListener(toggle);
                toggle.syncState();



        navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        navHeaderView = navigationView.getHeaderView(0);
        viewPager = (ViewPager) findViewById(R.id.viewPagerContainer);
        tabLayout = (TabLayout) findViewById(R.id.tabLayout);

        textViewNavigationName = (TextView) 
        navHeaderView.findViewById(R.id.textViewNavigationName);
        textViewNavigationEmail = (TextView) 
        navHeaderView.findViewById(R.id.textViewNavigationEmail);


         FragmentManager fragmentManager = getSupportFragmentManager();
         FragmentTransaction fragmentTransaction = 
         fragmentManager.beginTransaction();
         Fragment_Home objFragment1 = new Fragment_Home();                    
         fragmentTransaction.add(R.id.viewPagerContainer, objFragment1).addToBackStack("backkkkkkkkkkkkk");

         fragmentTransaction.commit();

       }

  }
    public class Fragment_Home extends Fragment
    {
        private static final String ARG_PAGE_KEY = "arg_page";
            String nextPageToken;
            String prevPageToken;
            String pageToken;
            int sizeOfPlaylist;
            int sizeOfCurrentList;
            int firstItemPosition;

            MenuItem nextItem;
            MenuItem lastItem;


            LinearLayout linearLayoutProgress, linearLayoutNoConnection;
            Button buttonReload;
            RecyclerView recyclerViewVideos;
            AllVideosAdapterR adapter;
            TextView textViewProgress;

            public static Fragment_Home newInstance(int pageNumber) {
                Fragment_Home myFragment = new Fragment_Home();
                Bundle arguments = new Bundle();
                arguments.putInt(ARG_PAGE_KEY, pageNumber);
                myFragment.setArguments(arguments);
                return myFragment;
            }

            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

                setHasOptionsMenu(true);
                LayoutInflater inflater1 = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View view = inflater1.inflate(R.layout.fragment_home, container, false);

                getActivity().invalidateOptionsMenu();

                findControls(view);

                gettingList();

                buttonReload.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        gettingList();

                    }
                });

                return view;

            }


           public void findControls(View view)
           {
               recyclerViewVideos = (RecyclerView)view.findViewById(R.id.recyclerViewVideos);
               linearLayoutProgress = (LinearLayout)view. findViewById(R.id.linearLayoutProgress);
               textViewProgress = (TextView) view.findViewById(R.id.textViewProgress);
               linearLayoutProgress.setVisibility(View.INVISIBLE);
               linearLayoutNoConnection = (LinearLayout)view.findViewById(R.id.linearLayoutNoConnection);
               linearLayoutNoConnection.setVisibility(View.INVISIBLE);
               buttonReload = (Button)view.findViewById(R.id.buttonReload);
           }

            private boolean isDeviceOnline() {
                ConnectivityManager connMgr =
                        (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
                return (networkInfo != null && networkInfo.isConnected());
            }

            public void setAdapter(List<Item> listItems) {

                recyclerViewVideos.setLayoutManager(new 
                LinearLayoutManager(getActivity()));
                adapter = new AllVideosAdapterR(getActivity(), listItems);
                recyclerViewVideos.setAdapter(adapter);
            }

            public void showProgress(String message) {

                textViewProgress.setText(message);
                linearLayoutProgress.setVisibility(View.VISIBLE);
            }


            public void stopProgress() {

                linearLayoutProgress.setVisibility(View.INVISIBLE);
            }

            public void gettingList() {

                if (!isDeviceOnline()) {
                    linearLayoutNoConnection.setVisibility(View.VISIBLE);
                } else {
                    linearLayoutNoConnection.setVisibility(View.INVISIBLE);
                }

                showProgress("Loading videos..");

                Retrofit retrofit = newRetrofit.Builder().baseUrl(BaseUrls.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
                WebApis call1 = retrofit.create(WebApis.class);
                Call<ListResponse> call = call1.requestList();
                call.enqueue(new Callback<ListResponse>() {
                    @Override
                    public void onResponse(Call<ListResponse> call, Response<ListResponse> response) {
                        System.out.println("size....................." + response.body().getItems().size());
                        setAdapter(response.body().getItems());
                        sizeOfPlaylist = response.body().getPageInfo().getTotalResults();

                        try {
                            nextPageToken = response.body().getNextPageToken();
                            prevPageToken = response.body().getPrevPageToken();
                            firstItemPosition = response.body().getItems().get(0).getSnippet().getPosition();
                            sizeOfCurrentList = response.body().getItems().size();
                        } catch (Exception e) {
                            Toast.makeText(getActivity(), "More pages not available", Toast.LENGTH_SHORT).show();
                        }
                        stopProgress();
                    }

                    @Override
                    public void onFailure(Call<ListResponse> call, Throwable t) {

                        stopProgress();
                        Toast.makeText(getActivity(), "Check your Network connection", Toast.LENGTH_LONG).show();
                        linearLayoutNoConnection.setVisibility(View.VISIBLE);

                    }
                });
            }

            public void gettingNextList(String token) {
                showProgress("Loading videos..");
                Retrofit retrofit = new Retrofit.Builder().baseUrl(BaseUrls.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
                WebApis call1 = retrofit.create(WebApis.class);
                Call<ListResponse> call = call1.requestNextList(token);
                call.enqueue(new Callback<ListResponse>() {
                    @Override
                    public void onResponse(Call<ListResponse> call, Response<ListResponse> response) {
                        System.out.println("size....................." + response.body().getItems().size());
                        setAdapter(response.body().getItems());
                        try {
                            nextPageToken = response.body().getNextPageToken();
                            prevPageToken = response.body().getPrevPageToken();
                            firstItemPosition = response.body().getItems().get(0).getSnippet().getPosition();
                            sizeOfCurrentList = response.body().getItems().size();
                        } catch (Exception e) {
                            Toast.makeText(getActivity(), "More pages not available", Toast.LENGTH_SHORT).show();
                        }

                        stopProgress();
                    }

                    @Override
                    public void onFailure(Call<ListResponse> call, Throwable t) {
                        stopProgress();
                        Toast.makeText(getActivity(), "Network Problem", Toast.LENGTH_LONG).show();

                    }
                });
            }  




 public interface WebApis {


                @GET(BaseUrls.GETTING_LIST)
                Call<ListResponse> requestList();

                @GET(BaseUrls.GETTING_LIST)
                Call<ListResponse> requestNextList(@Query("pageToken") String pageToken);


            }

        }