如何从通过 Intent 启动的 activity 中获取新数据?

How to fetch new data from an activity that was launched through an Intent?

这个问题有点复杂。在我的 RecyclerView 的自定义适配器的 ViewHolder 中,我实现了一个 onClickListener 并通过 onClick,我传递了一个意图,该意图用文本和 recyclerview 触发 EditItemActivity将项目位置列为附加项。在 EditItemActivity 中,我有一个 TextView,其中包含从意图和 "Save Changes" 按钮传递的文本。该文本属于我的 Recyclerview 列表中的特定列表项。更改文本后,我希望应用程序返回到带有列表的主屏幕,并使用新文本更新该特定项目。

到目前为止,这里是我能够成功实施的:

  1. EditItemActivity 在单击列表项时启动。
  2. 当 activity 启动时,它的文本视图与通过 onClick 启动 activity 的列表项具有相同的文本。

我要补充的:

这是我的实现。这是我的适配器中的 ViewHolder,其中包含 onClick:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView todoView;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            todoView = itemView.findViewById(R.id.to_do_display);
        }

        @Override
        public void onClick(View view) {
            Toast.makeText(context, "position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, EditItemActivity.class);
            intent.putExtra("data", todoView.getText());
            intent.putExtra("position", getAdapterPosition());
            context.startActivity(intent);
        }
    }

这是我更新该列表项文本的尝试:

public class EditItemActivity extends AppCompatActivity {

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

        final ToDoData toDoData = new ToDoData(this);
        final ToDoAdapter toDoAdapter = new ToDoAdapter(this);

        final EditText editToDo = (EditText)findViewById(R.id.edit_todo_item);
        Button button = (Button)findViewById(R.id.save_changes);
        final String text = getIntent().getExtras().getString("data");
        final String position = getIntent().getExtras().getString("position");
        editToDo.setText(text);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(editToDo.getText().toString() != text){
                    toDoData.setToDo(editToDo.getText().toString());
                    toDoAdapter.notifyDataSetChanged();
                    finish();
                }
            }
        });
    }
}

根据请求添加代码

具有列表视图的 class 的代码:

public class MainActivity extends AppCompatActivity {

    private List<ToDoData> toDoList = new ArrayList<>();

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

        final ToDoAdapter toDoAdapter = new ToDoAdapter(toDoList, this);

        final EditText toDoInput = (EditText)findViewById(R.id.add_todo);
        Button toDoAdd = (Button)findViewById(R.id.add_item);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        RecyclerView toDoDisplay = (RecyclerView) findViewById(R.id.toDoDisplayRecyclerView);
        toDoDisplay.setAdapter(toDoAdapter);
        toDoDisplay.setHasFixedSize(true);
        toDoDisplay.setLayoutManager(layoutManager);


        toDoAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ToDoData newToDoData = new ToDoData(MainActivity.this);
                newToDoData.setToDo(toDoInput.getText().toString());
                toDoList.add(newToDoData);
                toDoAdapter.notifyDataSetChanged();
                toDoInput.setText("");
            }
        });
    }
}

适配器代码:

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

    private List<ToDoData> toDoList;
    private Context context;

    public ToDoAdapter(List<ToDoData> todoList, Context context) {
        this.toDoList = todoList;
        this.context = context;
    }

    public ToDoAdapter(Context context){}

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView todoView;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            todoView = itemView.findViewById(R.id.to_do_display);
        }

        @Override
        public void onClick(View view) {
            Toast.makeText(context, "position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(context, EditItemActivity.class);
            intent.putExtra("data", todoView.getText());
            intent.putExtra("position", getAdapterPosition());
            context.startActivity(intent);
        }
    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position){
        ToDoData todoPosition = toDoList.get(position);

        holder.todoView.setText(todoPosition.getToDo());
    }

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

ToDoData.class

public class ToDoData implements Serializable{
    private String toDoString;

    public ToDoData(String todoString){
        this.toDoString = todoString;
    }

    public ToDoData(Context context){}

    public String getToDo() {
        return toDoString;
    }

    public void setToDo(String toDoString) {
        this.toDoString = toDoString;
    }
}
  1. 使您的 ToDoData class 实现可序列化。

    public class ToDoData implements Serializable{}
    
  2. 现在,通过 Intent 将 List<ToDoData>positondata 一起传递到 EditItemActivity 中:

    Intent intent = new Intent(MainActivity.this, EditItemActivity.class);
    intent.putExtra("data", todoView.getText());
    intent.putExtra("position", getAdapterPosition());
    //along with data and position, we are passing the list as well.
    intent.putExtra("LIST", (Serializable) toDoList); //this 'list' is your toDoList that you pass to the adapter (and gets populated into the view)
    startActivity(intent);
    
  3. 现在,在您的 EditItemActivity 中,

    从意图中接收列表为:

    Intent i = getIntent();
    list = (List<ToDoData>) i.getSerializableExtra("LIST");
    

    并将按钮点击的监听器设置为,

    toDoAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // set the new input of user from toDoInput into the list 
            list.set(position, *object_of_ToDoData_with_updated_user_input*);
            startActivity(new Intent(EditItemActiviy.this, MainActivity.class));
    
        }
    });
    
  4. 在 MainActivity 内部,

    @Override
    protected void onResume() {
        super.onResume();
        toDoAdapter.notifyDataSetChanged();
    
    }