简体   繁体   English

在创建 state 时将 RecyclerView 重置为其初始状态

[英]Resetting RecyclerView to its initail onCreate state

I have an simple app that displays texts in a RecyclerView .我有一个简单的应用程序,可以在RecyclerView中显示文本。 The fab adds new words to the recyclerview list each time it'os clicked.每次点击时, fab都会将新词添加到 recyclerview 列表中。

My problem now is resetting the RecyclerView to its original state (when activity was first created) when I click on Reset in the options menu.我现在的问题是将RecyclerView重置为其原始 state(首次创建活动时),当我单击选项菜单中的重置时。 I have tried different ways like mRecyclerView.invalidate();我尝试了不同的方法,例如mRecyclerView.invalidate(); then calling notifydataSetChanged();然后调用notifydataSetChanged(); on the mAdapter .mAdapter上。 Also using getRecycledViewPool().clear();也使用getRecycledViewPool().clear(); . . All to no avail.一切都无济于事。

Here's my MainActivity Code:这是我的 MainActivity 代码:

package com.example.recyclerview;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.recyclerview.adapters.WordListAdapter;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.LinkedList;

public class MainActivity extends AppCompatActivity {
    private final LinkedList<String> mWordList = new LinkedList<>();
    private RecyclerView mRecyclerView;
    private WordListAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mRecyclerView = findViewById(R.id.recyclerView);
        mAdapter = new WordListAdapter(this, mWordList);
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));



        for (int i = 0; i < 20; i++) {
            mWordList.addLast("Word " + i);
        }

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int mWordListSize = mWordList.size();
                mWordList.addLast("Word " + mWordListSize);
                mRecyclerView.getAdapter().notifyItemInserted(mWordListSize);
                mRecyclerView.smoothScrollToPosition(mWordListSize);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.reset) {
            // Resetting the RecyclerView
            mAdapter = new WordListAdapter(this, mWordList);
            mRecyclerView.setAdapter(mAdapter);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

and here'os my Adapter Code:这是我的适配器代码:

package com.example.recyclerview.adapters;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.recyclerview.R;

import java.util.LinkedList;

public class WordListAdapter extends RecyclerView.Adapter<WordListAdapter.WordViewHolder> {
    private final LinkedList<String> mWordList;
    private LayoutInflater mInflater;

    public WordListAdapter(Context context, LinkedList<String> wordList) {
        mInflater = LayoutInflater.from(context);
        this.mWordList = wordList;
    }

    @NonNull
    @Override
    public WordListAdapter.WordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = mInflater.inflate(R.layout.wordlist_item, parent, false);
        return new WordViewHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(@NonNull WordListAdapter.WordViewHolder holder, int position) {
        String mCurrent = mWordList.get(position);
        holder.wordItemView.setText(mCurrent);
    }

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

    class WordViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public final TextView wordItemView;
        final WordListAdapter mAdapter;

        public WordViewHolder(@NonNull View itemView, WordListAdapter adapter) {
            super(itemView);
            wordItemView = itemView.findViewById(R.id.word);
            this.mAdapter = adapter;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            int mPosition = getLayoutPosition();
            String element = mWordList.get(mPosition);
            mWordList.set(mPosition, "Clicked" + element);
            mAdapter.notifyDataSetChanged();
        }
    }
}

Extra:额外的:

Any help as to how i can manage click efficiently (without having to handle each item click in the adapter?? Thanks关于如何有效管理点击的任何帮助(无需处理适配器中的每个项目点击??谢谢

Recycler is displaying views depending on your WordList . Recycler 根据您的WordList显示视图。

So to reset, clear the data in your LinkedList by mWordList.clear();因此,要重置,请通过mWordList.clear(); and notify the adapter that data has changed by calling mAdapter.notifyDataSetChanged();并通过调用mAdapter.notifyDataSetChanged();

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.reset) {
        // Resetting the RecyclerView

        // to remove all items
        mWordList.clear();

        // add default items again
        for (int i = 0; i < 20; i++) {
            mWordList.addLast("Word " + I);
        }

        mAdapter.notifyDataSetChanged();

        return true;
    }
    return super.onOptionsItemSelected(item);
}

Extra额外的

  1. Don't use LinkedList for storing data.不要使用LinkedList来存储数据。 Instead, you can use an ArrayList which is suitable for most of the use cases.相反,您可以使用适用于大多数用例的ArrayList

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM