如何从通过 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 列表中的特定列表项。更改文本后,我希望应用程序返回到带有列表的主屏幕,并使用新文本更新该特定项目。
到目前为止,这里是我能够成功实施的:
EditItemActivity
在单击列表项时启动。
- 当 activity 启动时,它的文本视图与通过 onClick 启动 activity 的列表项具有相同的文本。
我要补充的:
- 当我更改
EditItemActivity
中的文本并单击 "Save Changes" 按钮时,它会更新同一列表项的文本。
这是我的实现。这是我的适配器中的 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;
}
}
使您的 ToDoData class 实现可序列化。
public class ToDoData implements Serializable{}
现在,通过 Intent 将 List<ToDoData>
与 positon
和 data
一起传递到 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);
现在,在您的 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));
}
});
在 MainActivity 内部,
@Override
protected void onResume() {
super.onResume();
toDoAdapter.notifyDataSetChanged();
}
这个问题有点复杂。在我的 RecyclerView 的自定义适配器的 ViewHolder
中,我实现了一个 onClickListener
并通过 onClick
,我传递了一个意图,该意图用文本和 recyclerview 触发 EditItemActivity
将项目位置列为附加项。在 EditItemActivity
中,我有一个 TextView,其中包含从意图和 "Save Changes" 按钮传递的文本。该文本属于我的 Recyclerview 列表中的特定列表项。更改文本后,我希望应用程序返回到带有列表的主屏幕,并使用新文本更新该特定项目。
到目前为止,这里是我能够成功实施的:
EditItemActivity
在单击列表项时启动。- 当 activity 启动时,它的文本视图与通过 onClick 启动 activity 的列表项具有相同的文本。
我要补充的:
- 当我更改
EditItemActivity
中的文本并单击 "Save Changes" 按钮时,它会更新同一列表项的文本。
这是我的实现。这是我的适配器中的 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;
}
}
使您的 ToDoData class 实现可序列化。
public class ToDoData implements Serializable{}
现在,通过 Intent 将
List<ToDoData>
与positon
和data
一起传递到 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);
现在,在您的 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)); } });
在 MainActivity 内部,
@Override protected void onResume() { super.onResume(); toDoAdapter.notifyDataSetChanged(); }