1

У меня есть пользовательский ввод. Деятельность, которая передает EditText данные обратно в список карт CardViews RecyclerView. Все работает нормально, за исключением одной проблемы. После того, как я создал первый список CardView в списке, следующий созданный CardView не обновляется строками ввода данных пользователя. Второй CardView показывает те же строки данных с первого входа (на первом CardView). Например, если я ввожу слово «яблоко» в строку EditText, то первый CardView отображает «яблоко» правильно. Позже я возвращаюсь к входной активности, а затем вводим слово «зеленый», и второй CardView будет создан, но он снова отобразит слово «яблоко» вместо ожидаемого «зеленого».Toast получает данные о намерениях, почему CardView в RecyclerView?

Я установил тосты для создания КартView, и они отображают правильные данные, полученные в методе onActivityResult (это означает, что первый ввод данных правильно показывает слово «яблоко» для первых тостов, а второй - «зеленый» «показывает второй комплект тостов). Поэтому, когда тосты правильно получают данные, возможно, что-то не работает с адаптером RecyclerView, который не обновляется должным образом. Есть идеи?

CardViewActivity входного файла:

... 
public void onClickSave(View v) { 
... 
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 returnIntent2 = new Intent(); 
     returnIntent2.putExtra("MESSAGE1", doMessage); 
     returnIntent2.putExtra("MESSAGE2", note1Message); 
     boolean success = true; 
     if (success) { 
      setResult(ListContactsActivity.RESULT_OK, returnIntent2); 
     } 
     else { 
      setResult(ListContactsActivity.RESULT_CANCELED, returnIntent2); 
     } 
     finish(); 
    } 

RecyclerViewActivity файл:

... 
@Override 
protected void onActivityResult(int requestCode,int resultCode,Intent data){ 
    super.onActivityResult(requestCode,resultCode,data); 
    if((requestCode==1)&&(resultCode==RESULT_OK)&&(data !=null)){ 
     String doMessage=data.getStringExtra("MESSAGE1"); 
     String note1Message=data.getStringExtra("MESSAGE2"); 
     Contact contact = new Contact(doMessage,note1Message); 
     mContactsAdapter.addItem(contact); 
     mRecyclerView.scrollToPosition(0); 
     Toast toast2 = Toast.makeText(this, doMessage, Toast.LENGTH_LONG); 
     toast2.setGravity(Gravity.CENTER_VERTICAL | Gravity.TOP,0,0); 
     toast2.show(); 
     Toast toast3 = Toast.makeText(this, note1Message, Toast.LENGTH_LONG); 
     toast3.setGravity(Gravity.CENTER_VERTICAL | Gravity.BOTTOM,0,0); 
     toast3.show(); 
    } 
} 

файл адаптера:

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

private static class EmptyViewHolder extends RecyclerView.ViewHolder { 
    public EmptyViewHolder(View itemView) { 
     super(itemView); 
    } 
} 

private class ContactViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView cardBlankText2; 

    public ContactViewHolder(View itemView) { 
     super(itemView); 
     cardBlankText2 = (TextView) itemView.findViewById(R.id.cardBlankText2); 
     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (mOnItemTapListener != null) { 
      Contact contact = mContacts.get(getLayoutPosition()); 
      mOnItemTapListener.onItemTap(contact, getLayoutPosition()); 
     } 
    } 
} 

private Context mContext; 
private LayoutInflater mLayoutInflater; 

private List<Contact> mContacts; 
private List<ListItem> mItems; 

private OnItemTapListener mOnItemTapListener; 

public ListContactsAdapter(Context context, List<Contact> contacts) { 
    mContext = context; 
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mContacts = contacts; 
    mItems = buildItemsList(); 
} 

public void setOnItemTapListener(OnItemTapListener listener) { 
    mOnItemTapListener = listener; 
} 

private List<ListItem> buildItemsList() { 
    List<ListItem> items = new ArrayList<>(); 
    if (mContacts.size() > 0) { 
     for (Contact contact : mContacts) { 
      items.add(new ContactItem(contact)); 
     } 
    } else { 
     // when R. list is first created or when the number of cards 
     // is deleted until there are zero, show the defaultcard_layout 
     // and "Click the + above to get started". 
     for (int i=0; i<1; i++) { 
      items.add(new EmptyItem()); 
     } 
    } 
    return items; 
} 

public void addItem(Contact contact) { 
    if (mContacts.size()==0) { 
     // if list is empty we must 
     // remove empty cards first 
     mItems.clear(); 
     notifyDataSetChanged(); 
    } 
    // in any case we need to add 
    // item on the top of the list and scroll to the top position 
    mContacts.add(contact); 
    mItems.add(new ContactItem(contact)); 
    notifyItemInserted(0); 
} 

public void removeItem(Contact contact, int position) { 
    mContacts.remove(contact); 
    if (mContacts.size()==0) { 
     // if no more contacts in list, 
     // we rebuild from scratch 
     mItems.clear(); 
     mItems.addAll(buildItemsList()); 
     notifyDataSetChanged(); 
    } else { 
     // else we just need to remove 
     // one item 
     mItems.remove(position); 
     notifyItemRemoved(position); 
    } 
} 

@Override 
public int getItemCount() { 
    return mItems.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    return mItems.get(position).getType(); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == ListItem.EMPTY_TYPE) { 
     View itemView = mLayoutInflater.inflate(R.layout.defaultcard_layout, parent, false); 
     return new EmptyViewHolder(itemView); 
    } else { 
     View itemView = mLayoutInflater.inflate(R.layout.singlecard_layout, parent, false); 
     return new ContactViewHolder(itemView); 
    } 
} 

@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 interface OnItemTapListener { 
    void onItemTap(Contact contact, int position); 
} 

}

+0

Можете ли вы разместить весь файл адаптера PLS –

+0

Хорошо, см. Править выше. – AJW

+0

Проверьте мой ответ ниже @AJW –

ответ

0

Слишком много осложнений. Давайте сделаем это простым. Проблема заключается в том, что в onActivityResult проблема заключается в том, что данные передаются в список.

Не забудьте изменить фрагмент, как показано ниже.

Первоначально объявляет Пользовательский список и пользовательский адаптер по всему миру. (В вашем случае: Контакты)

AdapterContactList conAdapter; 
List<Contact> conList; 

В OnCreate Инициализировать список и добавить пустой список к адаптеру и прикрепить его к RecyclerView.

conList= new ArrayList<>(); 
conAdapter= new AdapterContactList (this, conList); 
recyclerView.setAdapter(conAdapter); 

Затем в onActivityResult сделать это, как показано ниже.

if (resultCode == RESULT_OK && requestCode == 101) { 
    String doMessage = data.getStringExtra("MESSAGE1"); 
    String doMessage1 = data.getStringExtra("MESSAGE2"); 
    Contact con = new Contact(doMessage, doMessage1); 
    conList.add(con); 
    conAdapter.notifyDataSetChanged(); 
} 

Вот так, теперь вы увидите данные правильно заселение в представлении ресайклера. И надеюсь, что ваш адаптер Recycliewiew и остальная часть части работают нормально в этом случае.

Запросы дайте мне знать.

+0

Спасибо, я дам ему попробовать, а затем отчитается. – AJW

Смежные вопросы