Android:为什么 CardView 没有更新新的用户输入?
Android: why is CardView not updating with new user input?
我有一个 RecyclerView
可以根据用户输入(通过两个 EditText)创建 CardView
。
我可以正常创建新卡片。第一个 CardView
正确显示了两个用户输入字段。当我创建第二个 CardView
时,它在布局上正确显示,但两个数据输入字段不正确。第二个 CardView
没有显示第二组两个用户输入,而是显示与第一个 CardView
完全相同的两个用户输入。
创建第一个 CardView
之后,我需要清除 String
意图中的对象,这些对象被设置为 RecyclerView
[=47= 中的 onActivityResult()
].然后将下一个用户输入设置为下一个 CardView
。不知道为什么,但 Android Studio 还说 Contact class 中的 setSurname 从未使用过,即使它在适配器的 onBindViewHolder
方法中使用。
我是否需要使用 onStop()
方法来完成 onClickSave
方法并在用户完成在 EditText 字段中输入数据后销毁 CardViewActivity
?我在这里错过了什么?
CardViewActivity 用户输入的文件:
...
public void onClickSave(View v) {
final int stringToDo = cListenerEditText.getText().toString().replace(" ", "").length();
// if only the two user input fields have data
else if (stringToDo > 0 && stringNotes1 > 0 ) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(cListenerEditText.getWindowToken(), 0);
String doMessage = cListenerEditText.getText().toString();
String note1Message = dListenerEditText.getText().toString();
Intent intent = new Intent();
intent.putExtra("MESSAGE1", doMessage);
intent.putExtra("MESSAGE2", note1Message);
setResult(1, intent);
finish();
}
// If only stringToDo has data and others are empty.
else if (stringToDo > 0 && stringNotes1 == 0 && stringNotes2 == 0 &&
stringDueDate == 0 && stringDueTime ==0) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(cListenerEditText.getWindowToken(), 0);
String doMessage = cListenerEditText.getText().toString();
Intent intent = new Intent();
intent.putExtra("MESSAGE1", doMessage);
setResult(1, intent);
finish();
}
RecyclerView Activity 文件:
...
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1) {
String doMessage=data.getStringExtra("MESSAGE1");
String note1Message=data.getStringExtra("MESSAGE2");
Contact contact = new Contact(doMessage,note1Message);
mContactsAdapter.addItem(contact);
mRecyclerView.scrollToPosition(0);
}
}
适配器:
...
public class ListContactsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
...
private List<ListItem> buildItemsList() {
List<ListItem> items = new ArrayList<>();
if (mContacts.size() > 0) {
for (Contact contact : mContacts) {
items.add(new ContactItem(contact));
}
} else {
for (int i=0; i<1; i++) {
items.add(new EmptyItem());
}
}
return items;
}
public void addItem(Contact contact) {
if (mContacts.size()==0) {
mItems.clear();
notifyDataSetChanged();
}
mContacts.add(contact);
mItems.add(new ContactItem(contact));
notifyItemInserted(0);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {
int type = getItemViewType(position);
if (type == ListItem.CONTACT_TYPE) {
ContactItem item = (ContactItem) mItems.get(position);
final Contact contact = item.getContact();
ContactViewHolder holder = (ContactViewHolder) viewHolder;
holder.cardBlankText2.setText(contact.getName() + " " + contact.getSurname());
}
}
数据模型文件:
public class Contact {
private String name;
private String surname;
public Contact(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
使用Activity.setResult(int resultCode, Intent data),第一个参数是结果代码而不是请求代码。
您正在使用 setResult(1, intent);
,它类似于 setResult(Activity.RESULT_FIRST_USER, intent);
。
注意:
RESULT_FIRST_USER : Start of user-defined activity results.
将您的代码更改为:
setResult(Activity.RESULT_OK , intent);
和
if( (requestCode==1) && (resultCode==Activity.RESULT_OK) ) {
String doMessage=data.getStringExtra("MESSAGE1");
String note1Message=data.getStringExtra("MESSAGE2");
Contact contact = new Contact(doMessage,note1Message);
mContactsAdapter.addItem(contact);
//maybe you should call "mContactsAdapter.notifyItemInserted(...)" to refresh your adapter, if you didn't do that in addItem() method.
mRecyclerView.scrollToPosition(0);
}
PS: 根据您的 CardViewActivity
代码,data.getStringExtra("MESSAGE2")
可以 return 空对象。
查看您的代码,我发现这里 addItem
方法的实现存在问题:
mItems.add(new ContactItem(contact));
notifyItemInserted(0);
您似乎在底部添加项目并在顶部通知插入。您应该使插入和通知在位置上保持一致。特别是,如果您想在顶部插入,您应该按如下方式更改代码:
mItems.add(0, new ContactItem(contact));
notifyItemInserted(0);
我有一个 RecyclerView
可以根据用户输入(通过两个 EditText)创建 CardView
。
我可以正常创建新卡片。第一个 CardView
正确显示了两个用户输入字段。当我创建第二个 CardView
时,它在布局上正确显示,但两个数据输入字段不正确。第二个 CardView
没有显示第二组两个用户输入,而是显示与第一个 CardView
完全相同的两个用户输入。
创建第一个 CardView
之后,我需要清除 String
意图中的对象,这些对象被设置为 RecyclerView
[=47= 中的 onActivityResult()
].然后将下一个用户输入设置为下一个 CardView
。不知道为什么,但 Android Studio 还说 Contact class 中的 setSurname 从未使用过,即使它在适配器的 onBindViewHolder
方法中使用。
我是否需要使用 onStop()
方法来完成 onClickSave
方法并在用户完成在 EditText 字段中输入数据后销毁 CardViewActivity
?我在这里错过了什么?
CardViewActivity 用户输入的文件:
...
public void onClickSave(View v) {
final int stringToDo = cListenerEditText.getText().toString().replace(" ", "").length();
// if only the two user input fields have data
else if (stringToDo > 0 && stringNotes1 > 0 ) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(cListenerEditText.getWindowToken(), 0);
String doMessage = cListenerEditText.getText().toString();
String note1Message = dListenerEditText.getText().toString();
Intent intent = new Intent();
intent.putExtra("MESSAGE1", doMessage);
intent.putExtra("MESSAGE2", note1Message);
setResult(1, intent);
finish();
}
// If only stringToDo has data and others are empty.
else if (stringToDo > 0 && stringNotes1 == 0 && stringNotes2 == 0 &&
stringDueDate == 0 && stringDueTime ==0) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(cListenerEditText.getWindowToken(), 0);
String doMessage = cListenerEditText.getText().toString();
Intent intent = new Intent();
intent.putExtra("MESSAGE1", doMessage);
setResult(1, intent);
finish();
}
RecyclerView Activity 文件:
...
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1) {
String doMessage=data.getStringExtra("MESSAGE1");
String note1Message=data.getStringExtra("MESSAGE2");
Contact contact = new Contact(doMessage,note1Message);
mContactsAdapter.addItem(contact);
mRecyclerView.scrollToPosition(0);
}
}
适配器:
...
public class ListContactsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
...
private List<ListItem> buildItemsList() {
List<ListItem> items = new ArrayList<>();
if (mContacts.size() > 0) {
for (Contact contact : mContacts) {
items.add(new ContactItem(contact));
}
} else {
for (int i=0; i<1; i++) {
items.add(new EmptyItem());
}
}
return items;
}
public void addItem(Contact contact) {
if (mContacts.size()==0) {
mItems.clear();
notifyDataSetChanged();
}
mContacts.add(contact);
mItems.add(new ContactItem(contact));
notifyItemInserted(0);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {
int type = getItemViewType(position);
if (type == ListItem.CONTACT_TYPE) {
ContactItem item = (ContactItem) mItems.get(position);
final Contact contact = item.getContact();
ContactViewHolder holder = (ContactViewHolder) viewHolder;
holder.cardBlankText2.setText(contact.getName() + " " + contact.getSurname());
}
}
数据模型文件:
public class Contact {
private String name;
private String surname;
public Contact(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
使用Activity.setResult(int resultCode, Intent data),第一个参数是结果代码而不是请求代码。
您正在使用 setResult(1, intent);
,它类似于 setResult(Activity.RESULT_FIRST_USER, intent);
。
注意:
RESULT_FIRST_USER : Start of user-defined activity results.
将您的代码更改为:
setResult(Activity.RESULT_OK , intent);
和
if( (requestCode==1) && (resultCode==Activity.RESULT_OK) ) {
String doMessage=data.getStringExtra("MESSAGE1");
String note1Message=data.getStringExtra("MESSAGE2");
Contact contact = new Contact(doMessage,note1Message);
mContactsAdapter.addItem(contact);
//maybe you should call "mContactsAdapter.notifyItemInserted(...)" to refresh your adapter, if you didn't do that in addItem() method.
mRecyclerView.scrollToPosition(0);
}
PS: 根据您的 CardViewActivity
代码,data.getStringExtra("MESSAGE2")
可以 return 空对象。
查看您的代码,我发现这里 addItem
方法的实现存在问题:
mItems.add(new ContactItem(contact));
notifyItemInserted(0);
您似乎在底部添加项目并在顶部通知插入。您应该使插入和通知在位置上保持一致。特别是,如果您想在顶部插入,您应该按如下方式更改代码:
mItems.add(0, new ContactItem(contact));
notifyItemInserted(0);