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);