【发布时间】:2017-08-28 12:39:41
【问题描述】:
这是一个有点复杂的问题。在我的 RecyclerView 的自定义适配器的ViewHolder 中,我实现了一个onClickListener 并通过onClick,我传递了一个意图,该意图会触发EditItemActivity,其中包含文本和recyclerview 列表项位置作为额外内容。在EditItemActivity 中,我有一个TextView,其中包含从意图传递的文本和一个“保存更改”按钮。该文本属于我的 Recyclerview 列表中的特定列表项。更改文本后,我希望应用程序返回到带有列表的主屏幕,并使用新文本更新该特定项目。
到目前为止,这是我能够成功实现的:
-
每当单击列表项时,
EditItemActivity就会启动。 - 活动启动时,它的 textview 与 onClick 启动活动的列表项具有相同的文本。
我要补充的:
- 当我更改
EditItemActivity中的文本并单击“保存更改”按钮时,它会更新同一列表项的文本。
这是我的实现。这是我的适配器中的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();
}
}
});
}
}
根据请求添加代码
具有列表视图的类的代码:
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;
}
}
【问题讨论】:
-
您能否分享具有列表视图的活动代码和填充视图的适配器代码?
-
检查编辑... @SumitJha
标签: android android-intent android-recyclerview onclicklistener android-viewholder