Nano Hash - криптовалюты, майнинг, программирование

RecyclerView не фиксируется вверху при добавлении элементов

У меня есть этот 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, если я не начну прокрутку вниз?


Ответы:


1

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

mLayoutManager.scrollToPosition(yourPosition)
06.01.2020

2

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

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
            linearLayoutManager.setReverseLayout(true);
            linearLayoutManager.setStackFromEnd(true);
            yourRecyclerView.setLayoutManager(linearLayoutManager);
06.01.2020

3

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

Первый: не занимайте позицию в своей деятельности, но используйте размер 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();
}
06.01.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..