当前位置: 首页 > 知识库问答 >
问题:

“Android Studio”如何从碎片中嵌套的Recycleview开始活动?

宋飞文
2023-03-14
package com.example.jokestarapplication;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class JokeCategory  implements Parcelable{
    private String name;
    private List<Joke> jokes;

    public JokeCategory(String name) {
        this.name = name;
        this.jokes= new ArrayList<>();
    }

    protected JokeCategory(Parcel in){
        name=in.readString();
        in.readList(jokes,List.class.getClassLoader());
    }

    public JokeCategory(String name, List<Joke> jokes) {
        this.name = name;
        this.jokes = jokes;
    }

    public static final Creator<JokeCategory> CREATOR = new Creator<JokeCategory>() {
        @Override
        public JokeCategory createFromParcel(Parcel in) {
            return new JokeCategory(in);
        }

        @Override
        public JokeCategory[] newArray(int size) {
            return new JokeCategory[size];
        }
    };

    public String getName() {
        return name;
    }

    public String getJokeNumString() {
        return String.valueOf(jokes.size());
    }

    public List<Joke> getJokes() {
        return jokes;
    }

    @Override
    public String toString() {
        return name;
    }

    public void addJoke(Joke joke) {
        jokes.add(joke);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeList(jokes);
    }
}
package com.example.jokestarapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class CategoryListAdapter extends RecyclerView.Adapter<CategoryListAdapter.CategoryViewHolder> {

    private List<JokeCategory> mItems;
    private Context mContext;
    private ListItemClickListener mListItemClickListener;

    public CategoryListAdapter(List<JokeCategory> mItems, Context mContext, ListItemClickListener mListItemClickListener) {
        this.mItems = mItems;
        this.mContext = mContext;
        this.mListItemClickListener = mListItemClickListener;
    }

    @Override
    public int getItemViewType(final int position) {
        return R.layout.category_list_item;
    }

    @NonNull
    @Override
    public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        Context context = parent.getContext();
        mContext = context;
        LayoutInflater inflater = LayoutInflater.from(context);

        View view = inflater.inflate(R.layout.category_list_item, parent, false);

        return new CategoryViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CategoryViewHolder holder, int position) {
        holder.bind(position);
    }

    @Override
    public int getItemCount() {
        return (mItems==null) ? 0 : mItems.size();
    }

    interface ListItemClickListener {
        void onListItemClick(JokeCategory item);
    }

    public void setOnListItemClickListener(ListItemClickListener listItemClickListener) {
        mListItemClickListener = listItemClickListener;
    }

    public class CategoryViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        private TextView tvCatName, tvCatNum;

        public CategoryViewHolder(@NonNull View itemView) {
            super(itemView);
            tvCatName = itemView.findViewById(R.id.tvCatName);
            tvCatNum = itemView.findViewById(R.id.tvCatNum);
        }

        public TextView getTvCatName() {
            return tvCatName;
        }

        public TextView getTvCatNum() {
            return tvCatNum;
        }

        public void bind(int position) {
            tvCatName.setText(mItems.get(position).getName());
            tvCatNum.setText(mItems.get(position).getJokeNumString());
        }

        @Override
        public void onClick(View v) {
            if (mListItemClickListener!=null){
                int clickedIndex = getAdapterPosition();
                JokeCategory jokeCategory = mItems.get(clickedIndex);
                mListItemClickListener.onListItemClick(jokeCategory);
            }
        }
    }
}

主碎片


import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.LinkedList;
import java.util.List;

public class MainFragment extends Fragment implements CategoryListAdapter.ListItemClickListener {

    private CategoryListAdapter mAdapter;
    private RecyclerView rvcategories;
    private List<JokeCategory> categories;

    private onCategoryITemSelected listener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        categories = (List<JokeCategory>) getArguments().getSerializable("Categories");

        // Add the following lines to create RecyclerView
        rvcategories = view.findViewById(R.id.rvcategories);
        rvcategories.setHasFixedSize(true);
        rvcategories.setLayoutManager(new LinearLayoutManager(view.getContext()));
        mAdapter = new CategoryListAdapter(categories, getContext(), this);
        rvcategories.setAdapter(mAdapter);

        return view;
    }

    @Override
    public void onResume() {
        categories = (List<JokeCategory>) getArguments().getSerializable("Categories");
        rvcategories.getAdapter().notifyDataSetChanged();
        super.onResume();
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);

        if (context instanceof onCategoryITemSelected)
            listener = (onCategoryITemSelected) context;
        else
            throw new ClassCastException(context.toString() + "must implement listener");
    }

    @Override
    public void onListItemClick(JokeCategory item) {
        Intent i = new Intent(getContext(), ActivityCategory.class);
        i.putExtra(ActivityCategory.KEY_EXTRACATEGORY, item);
        startActivity(i);
    }


    public interface onCategoryITemSelected {
        void onListItemClick(JokeCategory item);
    }

    private List<JokeCategory> DemoData() {
        List<JokeCategory> data = new LinkedList<>();
        data.add(new JokeCategory("Short Jokes"));
        data.add(new JokeCategory("Long Jokes"));
        data.add(new JokeCategory("One Liner"));
        data.add(new JokeCategory("Dumb Jokes"));
        data.add(new JokeCategory("Chuck Norris"));

        return data;
    }
}

主要活动


import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.material.navigation.NavigationView;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


public class    MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{


    //global available user data
    public static String displayUserName;
    public static String displayUserEmail;
    GoogleSignInClient mGoogleSignInClient;
    private TextView displayName;
    private TextView displayEmail;
    private DrawerLayout drawerLayout;
    private ActionBarDrawerToggle actionBarDrawerToggle;
    private Toolbar toolbar;
    private NavigationView navigationView;
    private FragmentManager fragmentManager;
    private FragmentTransaction fragmentTransaction;

    private List<JokeCategory> categories;
    private Bundle bundle;

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

        drawerLayout = findViewById(R.id.drawer);
        navigationView = findViewById(R.id.navigationView);
        navigationView.setNavigationItemSelectedListener(this);

        actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open, R.string.close);
        drawerLayout.addDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        actionBarDrawerToggle.syncState();

        categories = DemoData();
        bundle = new Bundle();
        bundle.putSerializable("Categories", (Serializable) categories);

        //load default fragment

        fragmentManager = getSupportFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        MainFragment mainFragment = new MainFragment();
        mainFragment.setArguments(bundle);
        fragmentTransaction.replace(R.id.container_fragment, mainFragment);
        fragmentTransaction.commit();

        // Configure sign-in to request the user's ID, email address, and basic
        // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        // Build a GoogleSignInClient with the options specified by gso.
        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        // Side navigation elements (needs headerView since sidenav can be hidden (null)
        View headerView = navigationView.getHeaderView(0);
        displayName = (TextView) headerView.findViewById(R.id.displayName);
        displayEmail = (TextView) headerView.findViewById(R.id.displayEmail);

        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null) {
            //account.getDisplayName()
            Log.d("AUTH", "User is logged-in automatically");
            Toast.makeText(this, "Google Login automatically (already signed in previously)",
                    Toast.LENGTH_LONG).show();

            updateMainActivityUI(account);
        } else {
            Log.d("AUTH", "User is NOT logged-in automatically");
        }


    }

    public void updateMainActivityUI(GoogleSignInAccount account) {
        // Global vars
        displayUserName = account.getDisplayName();
        displayUserEmail = account.getEmail();
        //Side nav vars
        Log.d("AUTH", "side nav vars: " + displayUserName);
        Log.d("AUTH", "side nav vars: " + displayUserEmail);
       // if (displayUserName != null) {
            displayName.setText(displayUserName);
       // }
       // if (displayUserEmail != null) {
            displayEmail.setText(displayUserEmail);
      //  }


    }


    //move to new Fragment

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        drawerLayout.closeDrawer(GravityCompat.START);


        bundle = new Bundle();
        bundle.putSerializable("Categories", (Serializable) categories);

        fragmentManager = getSupportFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();

        switch (item.getItemId()) {
            case R.id.home:
                MainFragment mainFragment = new MainFragment();
                mainFragment.setArguments(bundle);
                fragmentTransaction.replace(R.id.container_fragment, mainFragment);
                break;

            case R.id.newJoke:
                NewJokeFragment newJokeFragment = new NewJokeFragment();
                newJokeFragment.setArguments(bundle);
                fragmentTransaction.replace(R.id.container_fragment, newJokeFragment);
                break;

            case R.id.logInOut:
                fragmentTransaction.replace(R.id.container_fragment, new LogInOutFragment());
                break;
            case R.id.aboutUs:
                fragmentTransaction.replace(R.id.container_fragment, new AboutUsFragment());
                break;

            case R.id.register:
                fragmentTransaction.replace(R.id.container_fragment, new RegisterFragment());
                break;

        }
        fragmentTransaction.commit();

        return true;
    }

    private List<JokeCategory> DemoData() {
        List<JokeCategory> data = new ArrayList<>();
        data.add(new JokeCategory("Short Jokes"));
        data.add(new JokeCategory("Long Jokes"));
        data.add(new JokeCategory("One Liner"));
        data.add(new JokeCategory("Dumb Jokes"));
        data.add(new JokeCategory("Chuck Norris"));

        return data;
    }

    public void updateCategories(List<JokeCategory> list){
        categories = list;
    }

}

共有1个答案

慕容耘豪
2023-03-14

看起来ItemView.onClickListener从未注册过。

将以下行添加到构造函数中。

ItemView.SetonClickListener(this);

       public CategoryViewHolder(@NonNull View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            tvCatName = itemView.findViewById(R.id.tvCatName);
            tvCatNum = itemView.findViewById(R.id.tvCatNum);
        }
 类似资料:
  • 我已经想从我的Main活动启动我的RecipientFra法规,并从我的Main活动将数据传递到Fra法规。这是我实现的代码。但是碎片没有开始。 我还想知道如何传递intent.set数据,并在碎片中获取数据。目前我有以下代码: 受体片段 主要活动

  • 我可以使用一个片段作为一个活动吗?我已经创建了一个片段,但我希望它有像活动一样的功能,所以我使用片段扩展碎片活动。然而,我有一个带有碎片的导航抽屉。当我更改为“扩展碎片活动”时,我的代码有问题?请给我指路。

  • 问题内容: 我有一堂课,称为extends 。 现在,在我的父级活动中,我想“运行”此片段。 这是我的: 如何运行/启动片段?我希望我的方法可以触发。 问题答案: 有很多文档!您需要的一切已经在这里。 当然,您需要在活动布局中使用该容器。

  • 我有两个碎片,两个碎片上都有一个按钮。当我按下按钮时,我想开始一项新的活动。但我不能让它工作。 我得到的错误:这里的错误:类型不匹配:无法从mFragmentFavorite转换为片段 我做错了什么? 我的碎片寻呼机适配器 收藏夹 如果FavoriteActivity扩展了片段,那么错误就消失了,但是我在findViewById(R.id.mainFavorite)处得到了一个错误 错误为 fin

  • 由于不推荐使用TabActivity,我需要找到一种方法来使用片段。在我知道它如何工作之前,我已经使用了碎片,但我需要一个指南来创建我的标签主机与碎片活动。我在互联网上找到了几个例子,它们都是关于将片段放入标签的容器中的。

  • 我读过很多关于这方面的文章,但也有2012年或更早的文章。 (我只是打算从数据库中读取和插入一些数据。)