RecyclerView не фиксируется сверху при добавлении элементов - PullRequest
1 голос
/ 06 января 2020

У меня есть этот RecyclerView, который больше не хочет показывать элемент в позиции 0, после добавления достаточного количества элементов, чтобы сделать RecyclerView прокручиваемым. Вместо этого он, кажется, придерживается нижнего элемента и прокручивает вниз с этим, хотя другие элементы добавляются в позиции 0.

public class hauptseite extends AppCompatActivity {
private ArrayList<ExampleItem> mExampleList;
private RecyclerView mRecyclerView;
private ExampleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private ImageButton btnInput;
private EditText editTextInput;
private int position = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    btnInput = findViewById(R.id.btn_add);
    editTextInput = findViewById(R.id.name_add);

    createExampleList();
    buildRecyclerView();

    btnInput = findViewById(R.id.btn_add);
    editTextInput = findViewById(R.id.name_add);

    btnInput.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = editTextInput.getText().toString();
            insertItem(name);
        }
    });
}

public void insertItem(String name) {
    mExampleList.add(position, new ExampleItem(name));
    mAdapter.notifyItemInserted(position);
    editTextInput.setText("");
}

public void removeItem(int position) {
    mExampleList.remove(position);
    mAdapter.notifyItemRemoved(position);
}

public void createExampleList() {
    mExampleList = new ArrayList<>();
}

public void buildRecyclerView() {
    mRecyclerView = findViewById(R.id.recyclerName);
    mRecyclerView.setHasFixedSize(false);
    mLayoutManager = new LinearLayoutManager(this);
    mAdapter = new ExampleAdapter(mExampleList);

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);

   mAdapter.setOnItemClickListener(new ExampleAdapter.OnItemClickListener(){
       @Override
    public void onDeleteClick(int position) {
        removeItem(position);
    }
    });
}

И адаптер

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<ExampleItem> mExampleList;
private OnItemClickListener mListener;

public interface OnItemClickListener {
    void onDeleteClick(int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}

public static class ExampleViewHolder extends RecyclerView.ViewHolder{
    public TextView mTextView1;
    public ImageView mDeleteName;

    public ExampleViewHolder(View itemView, final OnItemClickListener listener) {
        super(itemView);
        mTextView1 = itemView.findViewById(R.id.name_added);
        mDeleteName = itemView.findViewById(R.id.delete_name);

        mDeleteName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        listener.onDeleteClick(position);
                    }
                }
            }
        });
    }
}

public ExampleAdapter(ArrayList<ExampleItem> exampleList) {
    mExampleList = exampleList;
}

@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent, false);
    ExampleViewHolder evh = new ExampleViewHolder(v, mListener);
    return evh;
}

@Override
public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
    ExampleItem currentItem = mExampleList.get(position);

    holder.mTextView1.setText(currentItem.getName1());
}

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

Так что же делать Мне нужно изменить, когда я хочу, чтобы мой RecyclerView оставался у элемента в позиции 0, если я не начну прокручивать вниз?

Ответы [ 3 ]

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

есть простой способ это исправить. не добавляйте элемент в позицию 0 ... просто измените порядок по умолчанию вашего реселлераПросмотреть

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
            linearLayoutManager.setReverseLayout(true);
            linearLayoutManager.setStackFromEnd(true);
            yourRecyclerView.setLayoutManager(linearLayoutManager);
0 голосов
/ 06 января 2020

Я вижу два хороших способа решения этой проблемы:

Один: не занимать позицию в своей деятельности, а использовать размер ArrayList

public void insertItem(String name) {
    mExampleList.add(new ExampleItem(name));
    mAdapter.notifyItemInserted(mExampleList.size() - 1);
    editTextInput.setText("");
}

Два: двигаться список примеров и его методы в вашем адаптере. Таким образом, вы также можете удалить интерфейс для удаления и позволить адаптеру обрабатывать все это. Я также добавил метод для извлечения текущего списка элементов из адаптера, если вам нужны эти данные вне адаптера.

Активность:

public class hauptseite extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ExampleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private ImageButton btnInput;
private EditText editTextInput;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    btnInput = findViewById(R.id.btn_add);
    editTextInput = findViewById(R.id.name_add);

    buildRecyclerView();

    btnInput = findViewById(R.id.btn_add);
    editTextInput = findViewById(R.id.name_add);

    btnInput.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = editTextInput.getText().toString();
            mAdapter.insertItem(name);
        }
    });
}

public void removeItem(int position) {
    mAdapter.notifyItemRemoved(position);
}

public void createExampleList() {
    mExampleList = new ArrayList<>();
}

public void buildRecyclerView() {
    mRecyclerView = findViewById(R.id.recyclerName);
    mRecyclerView.setHasFixedSize(false);
    mLayoutManager = new LinearLayoutManager(this);
    mAdapter = new ExampleAdapter();

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);
}

И адаптер:

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<ExampleItem> mExampleList;

public insertItem(String name) {
   mExampleList.add(name);
   this.notifyItemAdded(mExampleList.size() -1)
}

public removeItem(int position) {
   mExampleList.remove(position);
   this.notifyItemRemoved(position);
}

public ArrayList<ExampleItems> getItems() {
  return mExampleList();
}

public static class ExampleViewHolder extends RecyclerView.ViewHolder{
    public TextView mTextView1;
    public ImageView mDeleteName;

    public ExampleViewHolder(View itemView, final OnItemClickListener listener) {
        super(itemView);
        mTextView1 = itemView.findViewById(R.id.name_added);
        mDeleteName = itemView.findViewById(R.id.delete_name);

        mDeleteName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        removeItem(position);
                    }
                }
            }
        });
    }
}

public ExampleAdapter() {
    mExampleList = new ExampleList();
}
0 голосов
/ 06 января 2020

Вы можете прокрутить до нужной позиции на вставке:

mLayoutManager.scrollToPosition(yourPosition)
...