Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何设置onclick listener recyclerview并在每次单击时启动新活动_Android - Fatal编程技术网

Android 如何设置onclick listener recyclerview并在每次单击时启动新活动

Android 如何设置onclick listener recyclerview并在每次单击时启动新活动,android,Android,我正在使用recyclerview,无法开始新的活动 在每次点击时。如何启动新的活动recyclerview 以下是我的代码: 主要活动: public class MainActivity extends AppCompatActivity { private List<Data> dataList = new ArrayList<>(); private RecyclerView recycler_view; private Custom_

我正在使用
recyclerview
,无法开始新的活动 在每次点击时。如何启动新的活动recyclerview

以下是我的代码:

主要活动:

public class MainActivity extends AppCompatActivity  {

    private List<Data> dataList = new ArrayList<>();
    private RecyclerView recycler_view;
    private Custom_Adapter custom_adapter;

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

        recycler_view = (RecyclerView) findViewById(R.id.recycler_view);

        custom_adapter = new Custom_Adapter(dataList);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recycler_view.setLayoutManager(mLayoutManager);
        recycler_view.setItemAnimator(new DefaultItemAnimator());
        recycler_view.setAdapter(custom_adapter);

        prepareMovieData();
    }

    private void prepareMovieData() {

        Data data = new Data("Preamble");

        dataList.add(data);

        data = new Data("Parts");
        dataList.add(data);

        data = new Data("Schedules");
        dataList.add(data);

        data = new Data("Amendments");
        dataList.add(data);

        data = new Data("Quiz");
        dataList.add(data);

        custom_adapter.notifyDataSetChanged();
    }
}

我想在每次单击时开始新的活动。我该怎么做才能开始新的生活?我可以使用switch case吗?

您应该在Viewholder的onClick方法中启动新活动,如下所示

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

public View view;

public TextView title;

public MyViewHolder(final View itemView)  {
    super(itemView);

    itemView.setOnClickListener(this);
    title=(TextView)itemView.findViewById(R.id.tv_title);

}

@Override
public void onClick(View view) {

// To get context. You can pass it to the adapter from activity when  
// creating the instance of adapter or you can get it from Viewgroup 
// inside onCreateViewHolder using parent.getContext().  

startActivity(new Intent(context, NewActivity.class));

}
}

下面是一些代码和一个示例,展示了如何使用switch实现这一点。但是,要使用vertabim,您需要一个适当的回调模式——即,将onClickListener创建为一个匿名类,并将其传递给adapters构造函数。然后让适配器保留一个引用并将其传递给VH onBind

//in Adapter, Viewholder
private View.OnClickListener mCallback;

public Custom_Adapter(List<Data> dataList, View.OnClickListener callback) {
    this.dataList = dataList;
    mCallback = callback;
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    holder.itemView.setOnClickListener(mCallback);
    holder.itemView.setTag(position);
    ...
}

//in Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    custom_adapter = new Custom_Adapter(dataList, new OnClickListener() {
        @Override
        public void onClick(View view) {

            Class<? extends Activity> target;
            switch( (int) view.getTag() ) {
                case 0:
                    target = PreambleActivity.class;
                    break;
                ...
            }

            if (target != null) {
                Intent intent = new Intent(MainActivity.this, target);
                startActivity(intent);
            }
        }
    });
}
//在适配器、Viewholder中
private View.OnClickListener mCallback;
公共自定义_适配器(列表dataList、View.OnClickListener回调){
this.dataList=dataList;
mCallback=回调;
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,最终整数位置){
holder.itemView.setOnClickListener(mCallback);
holder.itemView.setTag(位置);
...
}
//活跃
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
自定义\u适配器=新的自定义\u适配器(数据列表,新OnClickListener(){
@凌驾
公共void onClick(视图){

类,该类将对每个项目硬编码相同的活动,而且startActivity也不可从中使用。将活动引用传递给适配器,只要您不做一些愚蠢的事情,例如将引用保存在适配器中的静态变量中,它就不会导致泄漏。是的,它会将新的单击侦听器附加到每个ViewHolder,这就是为什么您可以这样做。或者只是在适配器的作用域中创建一个单击侦听器并使用它(变量target可能未初始化)。如果(target!=null){Intent Intent Intent=new Intent(MainActivity.this,target);startActivity(Intent);},那么在创建它时只需将其初始化为null
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener  {

public View view;

public TextView title;

public MyViewHolder(final View itemView)  {
    super(itemView);

    itemView.setOnClickListener(this);
    title=(TextView)itemView.findViewById(R.id.tv_title);

}

@Override
public void onClick(View view) {

// To get context. You can pass it to the adapter from activity when  
// creating the instance of adapter or you can get it from Viewgroup 
// inside onCreateViewHolder using parent.getContext().  

startActivity(new Intent(context, NewActivity.class));

}
}
//in Adapter, Viewholder
private View.OnClickListener mCallback;

public Custom_Adapter(List<Data> dataList, View.OnClickListener callback) {
    this.dataList = dataList;
    mCallback = callback;
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    holder.itemView.setOnClickListener(mCallback);
    holder.itemView.setTag(position);
    ...
}

//in Activity

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    custom_adapter = new Custom_Adapter(dataList, new OnClickListener() {
        @Override
        public void onClick(View view) {

            Class<? extends Activity> target;
            switch( (int) view.getTag() ) {
                case 0:
                    target = PreambleActivity.class;
                    break;
                ...
            }

            if (target != null) {
                Intent intent = new Intent(MainActivity.this, target);
                startActivity(intent);
            }
        }
    });
}