RecylerView не перечисляет элементы по порядку при добавлении динамически после добавления 3-го элемента - PullRequest
2 голосов
/ 16 января 2020

У меня есть кнопка с надписью ADD ITEM.

Ниже есть RECYCLERVIEW.

. Когда вы нажимаете ADD ITEM, он добавляет EDITVIEW в представление переработчика. , Вы вводите в него текст, а затем снова нажимаете ADD ITEM, и он добавляет еще один EDITVIEW в представление recyler.

Все в правильном порядке.

Когда вы нажимаете ADD ITEM в 4-й раз, вместо добавления на 4-й позиции, он добавляет на 1-ю позицию и перемещает предыдущие 3 элемента вниз на 1.

Что может быть причиной этого?

Основная деятельность

package com.app.bowling.animalsrecycler;


import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;

import static java.sql.Types.NULL;

public class MainActivity extends Activity implements RemoveClickListner{
    private RecyclerView mRecyclerView;
    private RecyclerAdapter mRecyclerAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    Button btnAddItem;
    ArrayList<RecyclerData> myList = new ArrayList<>();
     EditText etTitle;
    String title = "";
    ImageView crossImage;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerAdapter = new RecyclerAdapter(myList,this);


        mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));
        mRecyclerView.setAdapter(mRecyclerAdapter);

         etTitle = (EditText) findViewById(R.id.etTitle);


        if (mRecyclerAdapter.getItemCount() == 0 || mRecyclerAdapter.getItemCount() == NULL){
            Toast.makeText(getApplicationContext(),"ZERO ITEMS LISTED",Toast.LENGTH_SHORT).show();
        }

        btnAddItem = (Button) findViewById(R.id.btnAddItem);
        btnAddItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                title = etTitle.getText().toString();

 //               if (title.matches("")) {
 //                   Toast.makeText(v.getContext(), "You did not enter a Title", Toast.LENGTH_SHORT).show();
 //                   return;
 //               }


                RecyclerData mLog = new RecyclerData();
//                mLog.setTitle(title);

                myList.add(mLog);
                mRecyclerAdapter.notifyData(myList);
                etTitle.setText("");


                if (mRecyclerAdapter.getItemCount() > 0) {
                    Toast.makeText(v.getContext(), mRecyclerAdapter.getItemCount() + " Items Displayed", Toast.LENGTH_SHORT).show();
                    return;
                }

            }
        });
    }
    @Override
    public void OnRemoveClick(int index) {
        myList.remove(index);
        mRecyclerAdapter.notifyData(myList);
    }
}

RecyclerAdapter

package com.app.bowling.animalsrecycler;

import android.support.constraint.ConstraintLayout;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerItemViewHolder> {
    private ArrayList<RecyclerData> myList;
    int mLastPosition = 0;
    private RemoveClickListner mListner;
    public RecyclerAdapter(ArrayList<RecyclerData> myList,RemoveClickListner listner) {
        this.myList = myList;
        mListner=listner;
    }
    public RecyclerItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);
        RecyclerItemViewHolder holder = new RecyclerItemViewHolder(view);
        return holder;
    }
    @Override
    public void onBindViewHolder(RecyclerItemViewHolder holder, final int position) {
        Log.d("onBindViewHolder ", myList.size() + "");

        mLastPosition = position;
        holder.crossImage.setImageResource(R.drawable.ic_add_circle_black_24dp);
        holder.etTitleTextView.setHint("Enter Player " + (position + 1));
        holder.etTitleTextView.requestFocus();
    }
    @Override
    public int getItemCount() {
        return(null != myList?myList.size():0);
    }
    public void notifyData(ArrayList<RecyclerData> myList) {
        Log.d("notifyData ", myList.size() + "");
        this.myList = myList;
        notifyDataSetChanged();
    }
    public class RecyclerItemViewHolder extends RecyclerView.ViewHolder {
        private final TextView etTitleTextView;
        private ConstraintLayout mainLayout;
        public ImageView crossImage;
        public RecyclerItemViewHolder(final View parent) {
            super(parent);


            etTitleTextView = parent.findViewById(R.id.txtTitle);
            etTitleTextView.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                myList.get(getAdapterPosition()).setTitle(etTitleTextView.getText().toString());
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });



                    crossImage = (ImageView) parent.findViewById(R.id.crossImage);
            mainLayout = (ConstraintLayout) parent.findViewById(R.id.mainLayout);
            mainLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(itemView.getContext(), "Position:" + Integer.toString(getPosition()), Toast.LENGTH_SHORT).show();
                }
            });
            crossImage.setOnClickListener(new AdapterView.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mListner.OnRemoveClick(getAdapterPosition()
                    );
                }
            });
        }
    }

RecyclerData

package com.app.bowling.animalsrecycler;

import android.support.v7.widget.RecyclerView;
import android.widget.ImageView;

public class RecyclerData {
    String title;

    RecyclerView data;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }


    public void setCrossImage(ImageView crossImage){
        setCrossImage(crossImage);
    }
}

RemoveClickLstner

package com.app.bowling.animalsrecycler;

public interface RemoveClickListner {
    void OnRemoveClick(int index);
}

Activity_Main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:padding="16dp"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Title"
        android:id="@+id/etTitle" />

    <Button
        android:id="@+id/btnAddItem"
        android:text="Add Item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#dbfffe" />
</LinearLayout>

RecyclerView_Item

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_margin="8dp"
    android:id="@+id/cardview"
    android:layout_height="112dp">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/mainLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <EditText
            android:id="@+id/txtTitle"
            android:maxLines="1"
            android:inputType="text"
            android:maxLength="15"
            android:layout_width="273dp"
            android:layout_height="56dp"
            android:layout_marginEnd="122dp"
            android:layout_marginBottom="56dp"
            android:padding="12dp"
            android:textColor="@android:color/black"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_conversion_absoluteHeight="0dp"
            tools:layout_conversion_absoluteWidth="0dp"
            tools:layout_conversion_wrapHeight="0"
            tools:layout_conversion_wrapWidth="0" />


        <ImageView
            android:id="@+id/crossImage"
            android:layout_width="136dp"
            android:layout_height="112dp"
            android:layout_marginStart="273dp"
            android:background="@drawable/ic_add_circle_black_24dp"
            android:paddingLeft="10dp"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_conversion_absoluteHeight="0dp"
            tools:layout_conversion_absoluteWidth="0dp"
            tools:layout_conversion_wrapHeight="0"
            tools:layout_conversion_wrapWidth="0" />
    </android.support.constraint.ConstraintLayout>
</LinearLayout>

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Я хотел бы видеть ваш макет action_main и recycler_view, потому что я пытался реализовать ваш код с небольшими изменениями, и код работает хорошо, пожалуйста, проверьте код ниже

https://github.com/muchbeer/StackOverflowRecyclerView

Пожалуйста, найдите ниже снимок экрана

a busy coder

Кинди, дайте мне знать, если это было ваше предназначение

0 голосов
/ 16 января 2020

Просто попробуйте заменить приведенный ниже фрагмент

myList.add(mLog);
mRecyclerAdapter.notifyData(myList);
etTitle.setText("");

Добавьте это:

myList.add(mLog);
mRecyclerAdapter.addAll(myList);
mRecyclerAdapter.notifyDataSetChanged();
etTitle.setText("");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...