Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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
Java 从recyclerview行中的项目调用新活动_Java_Android_Android Activity_Android Recyclerview_Startactivityforresult - Fatal编程技术网

Java 从recyclerview行中的项目调用新活动

Java 从recyclerview行中的项目调用新活动,java,android,android-activity,android-recyclerview,startactivityforresult,Java,Android,Android Activity,Android Recyclerview,Startactivityforresult,当我的recyclerview行元素中的一个按钮被调用时,我需要调用一个新的活动。列表中的每一行项目包含4个按钮,其中一个按钮需要打开一个新的活动,该活动将用于编辑该行中的数据 以下是迄今为止我的按钮的代码: public void onBindViewHolder(CounterLayoutAdapter.ViewHolder holder, final int position) { final Counter counter = counterList.get(posit

当我的recyclerview行元素中的一个按钮被调用时,我需要调用一个新的活动。列表中的每一行项目包含4个按钮,其中一个按钮需要打开一个新的活动,该活动将用于编辑该行中的数据

以下是迄今为止我的按钮的代码:

public void onBindViewHolder(CounterLayoutAdapter.ViewHolder holder, final 
    int position) {
    final Counter counter = counterList.get(position);
    //counter is a class which holds the data that will be displayed on one 
    //row

    String comment = counter.getComment();
    String name = counter.getCounterName();
    int number = counter.getCurrentValue();
    //LocalDate modifyDate = counter.getLastModifyDate();

    Button up = holder.itemView.findViewById(R.id.buttonUp);
    Button down = holder.itemView.findViewById(R.id.buttonDown);
    Button reset = holder.itemView.findViewById(R.id.buttonReset);
    Button edit = holder.itemView.findViewById(R.id.buttonEdit);
    Button delete = holder.itemView.findViewById(R.id.buttonDelete);

 //  code for 4 other buttons goes here
 //
    edit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        }
    });
因为我需要打开的活动为我返回用户输入的数据,所以我使用startActivityForResult。然而,据我所知,这只在实际的活动类中起作用

然后我尝试将mainactivity上下文传递给我的CounterLayoutAdapter类,我所有的按钮代码都在那里。但是,OnBindViewHolder方法仍然无法在那里访问它。因此,我尝试将上下文传递给OnBindViewHolder,但这也不起作用,因为这样做不会重写抽象类

那么,我到底该怎么称呼这里的新活动呢

或者,如果有其他方法可以让用户输入4个字段,并将输入返回到适配器,而不调用活动,那么也可以

编辑:视图保持架和布局膨胀

   public static class ViewHolder extends RecyclerView.ViewHolder implements 
   View.OnClickListener {
        private TextView name;
        private TextView comment;
        private TextView number;
        //private TextView date;



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

            comment = itemView.findViewById(R.id.textComment);
            name = itemView.findViewById(R.id.textName);
            number = itemView.findViewById(R.id.editTextNum);
            //date = itemView.findViewById(R.id.textDate);

        }

        @Override
        public void onClick(View view) {}
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflatedView = 
    LayoutInflater.from(parent.getContext()).inflate(R.layout
        .row_layout, parent, false);
        return new ViewHolder(inflatedView);
    }

如您所见,您不必在
onBindViewHolder
findViewById

public void onBindViewHolder(CounterLayoutAdapter.ViewHolder holder, final 
int position) {
final Counter counter = counterList.get(position);
//counter is a class which holds the data that will be displayed on one 
//row

String comment = counter.getComment();
String name = counter.getCounterName();
int number = counter.getCurrentValue();
//LocalDate modifyDate = counter.getLastModifyDate();


holder.edit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    }
});
然后您应该在
ViewHolder
constructor中初始化
edit

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

        comment = itemView.findViewById(R.id.textComment);
        name = itemView.findViewById(R.id.textName);
        number = itemView.findViewById(R.id.editTextNum);
        //date = itemView.findViewById(R.id.textDate);
        // init four button
        edit = itemView.findViewById(R.id.buttonEdit)

    }

您可以在适配器类中调用
startActivityForResult()

  • 在适配器中获取上下文,如
    context-context=holder.up.getContext()
  • 然后在按钮的OnClickListener中执行此操作

    edit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(context,ActivityYouWantToStart.class);
            //Pass any extras if you want to.
            ((Activity)context).startActivityForResult(intent,REQUEST_CODE);
        }
    });
    
  • 然后在您的活动(包含此recyclerView)中,按如下方式覆盖活动结果

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE) {//same REQUEST_CODE you used in adapter
    
             if (resultCode == RESULT_OK) {
    
                //Do your thing and get the data you want.
    
               adapter.onDataReady(Data data);//where adapter is your recycler adapter, 
                                              //and data is whatever data you want to pass to adapter 
                                              //(Data you got from the activityResult, do not confuse it with onActivityResult's parameter 'Intent data') 
            }
        }
    }
    
  • 最后,在您的Recycler适配器类中,定义如下函数

    public void onDataReady(Data data){
       //Update RecyclerView with new data
    }
    

希望这有帮助。我曾经这样做过,它对我很有用。如果您有任何问题,请告诉我。

您是否正在扩展布局?是的,我正在扩展布局,我在帖子中添加了该代码。您获取上下文的方法无效,但onDataReady函数解决了我的问题。