如何从此 RecyclerView 开始活动?

How to start activities from this RecyclerView?

我有一个充满元素的 RecyclerView,在本例中是 CardView,我还有一个开关,它根据状态对 RecyclerView 的元素进行排序,因此元素会根据此改变它们的位置,我想去与回收站视图的每个元素不同 activity,但我有点卡住了,因为我还没有找到任何源以我的方式初始化元素的数据。

这是 RECYCLERVIEW:

public class CategoriesRecyclerView extends Activity {
    private List<Categories> categories;
    private RecyclerView rv;
    private Switch categoriesSortingSwitch;
    private TextView switchStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.categories_recycler_view);


        rv = (RecyclerView) findViewById(R.id.cardList);
        rv.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        rv.setLayoutManager(llm);

        initializeData();

        final CategoriesAdapter ca = new CategoriesAdapter(categories);
        rv.setAdapter(ca);



        //IMPLEMENTACIÓN DE EL SORTING POR MEDIO DE EL SWITCH
        categoriesSortingSwitch = (Switch) findViewById(R.id.switchsortcategories);
        switchStatus = (TextView) findViewById(R.id.testswitch);
        //set the switch to OFF
        categoriesSortingSwitch.setChecked(false);
        //attach a listener to check for changes in state
        categoriesSortingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if(isChecked){
                    switchStatus.setText("Sorting alphabetically");


                    Collections.sort(categories, new Comparator<Categories>() {
                        @Override
                        public int compare(Categories lhs, Categories rhs) {
                            return lhs.title.compareTo(rhs.title);
                        }
                    });


                    ca.notifyDataSetChanged();

                }else{
                    switchStatus.setText("Sorting by popularity");

                    Collections.sort(categories, new Comparator<Categories>() {
                        @Override
                        public int compare(Categories rhs, Categories lhs) {
                            return lhs.title.compareTo(rhs.title);
                        }
                    });

                ca.notifyDataSetChanged();
                }

            }
        });


        //check the current state before we display the screen
        if(categoriesSortingSwitch.isChecked()){
            switchStatus.setText("Sorting alphabetically");


            Collections.sort(categories, new Comparator<Categories>() {
                @Override
                public int compare(Categories lhs, Categories rhs) {
                    return lhs.title.compareTo(rhs.title);
                }
            });


        }
        else {
            switchStatus.setText("Sorting by popularity");

            Collections.sort(categories, new Comparator<Categories>() {
                @Override
                public int compare(Categories rhs, Categories lhs) {
                    return lhs.title.compareTo(rhs.title);
                }
            });

        }

    }

    private void initializeData() {


        categories = new ArrayList<>();
        categories.add(new Categories("CARS", "CARS"));
        categories.add(new Categories("SPORTS", "SPORTS"));
        categories.add(new Categories("GAMING", "GAMING"));
        categories.add(new Categories("GAMBLING", "GAMBLING"));
        categories.add(new Categories("TECH", "TECH"));
        categories.add(new Categories("NATURE", "NATURE"));
        categories.add(new Categories("RANDOM", "RANDOM"));
        categories.add(new Categories("COUSINE", "COUSINE"));
        categories.add(new Categories("HISTORY", "HISTORY"));
        categories.add(new Categories("MUSIC", "MUSIC"));
        categories.add(new Categories("STUDIES", "STUDIES"));
    }

}

这是适配器:

public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.CategoriesViewHolder>  {

    private List<Categories> categoriesList;

    public CategoriesAdapter(List<Categories> categoriesList) {
        this.categoriesList = categoriesList;

    }


    public static class CategoriesViewHolder extends RecyclerView.ViewHolder {

        CardView cv;
        TextView title;
        TextView category_title;

        //ImageView category_img; CUANDO VALLA A REMPLAZAR LA FORO DE CATEGORIA

        CategoriesViewHolder(View itemView) {
            super(itemView);
            cv = (CardView)itemView.findViewById(R.id.card_view);
            title = (TextView)itemView.findViewById(R.id.title);
            category_title = (TextView)itemView.findViewById(R.id.category_title);
            //category_img = (ImageView)itemView.findViewById(R.id.category_picture);

        }

    }

    @Override
    public int getItemCount() {
        return categoriesList.size();
    }

    @Override
    public void onBindViewHolder(CategoriesViewHolder categoriesViewHolder, final int i) {
        Categories ci = categoriesList.get(i);

        categoriesViewHolder.title.setText(categoriesList.get(i).title);
        categoriesViewHolder.category_title.setText(categoriesList.get(i).category_title);
        //categoriesViewHolder.categori_img.setImageResource(categoriesList.get(i).photoId);
    }

    @Override
    public CategoriesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_row, viewGroup, false);

        return new CategoriesViewHolder(itemView);
    }
}

我将非常感谢有关如何执行此操作的任何说明。 百万感谢。

要从 RecyclerView 项目点击集开始新的 Activity,onCreateViewHolder 中行的根视图的 onClick 侦听器:

@Override
  public CategoriesViewHolder onCreateViewHolder(ViewGroup viewGroup,int i){
         View itemView =....;
         itemView.setClickable(true);
         itemView.setOnClickListener(new View.OnClickListener()
          {
           @Override
            public void onClick(View view)
            {
              // starte new Activity here
            }
         });
        return new CategoriesViewHolder(itemView);
    }

此外,如果子视图在 category_row 布局中且可聚焦,则为每个视图设置 android:duplicateParentState="true"

在 onBindViewHolder 中执行。

@Override
public void onBindViewHolder(CategoriesViewHolder categoriesViewHolder, final int i) {
    final Categories ci = categoriesList.get(i);

    categoriesViewHolder.title.setText(categoriesList.get(i).title);
    categoriesViewHolder.category_title.setText(categoriesList.get(i).category_title);
    //categoriesViewHolder.categori_img.setImageResource(categoriesList.get(i).photoId);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // launch activity by Categories

        }
    });
}

设置您的 ViewHolder 以实现 View.OnClickListener。在 onClick() 方法中,您可以调用 ViewHolder.getAdapterPosition() 并检查哪个 activity 应该由该位置的项目启动。

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    ViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int position = getAdapterPosition();

        // Logic to start correct activity class based on position
    }
}

这样做可以确保您只在创建 ViewHolder 时创建新的侦听器。如果您在 onBindView() 中创建新的侦听器,则每次滚动时都会创建新的对象。

另一种选择是使用不同的视图类型。在 getItemViewType() 中将您的适配器设置为 return 一个不同的整数,具体取决于您在 onClick 中想要的行为。然后,在 onCreateViewHolder() 中,您可以添加一个 OnClickListener 并使用该整数(作为 viewType 参数传递)来确定其行为。但是,如果您的所有列表项都启动了不同的活动,那么这将意味着您需要为每个项目使用单独的视图类型,这样它们就不会非常有效地被回收。