【问题标题】:Resetting RecyclerView to its initail onCreate state将 RecyclerView 重置为其初始 onCreate 状态
【发布时间】:2020-08-31 07:28:48
【问题描述】:

我有一个简单的应用程序,可以在 RecyclerView 中显示文本。 fab 每次点击时都会将新词添加到 recyclerview 列表中。

我现在的问题是将RecyclerView 重置为其原始状态(首次创建活动时),当我单击选项菜单中的重置 时。我尝试了不同的方法,例如mRecyclerView.invalidate(); 然后在 mAdapter 上调用 notifydataSetChanged();。也使用getRecycledViewPool().clear();。一切都无济于事。

这是我的 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);
    }
}

这是我的适配器代码:

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();
        }
    }
}

额外:

关于如何有效管理点击的任何帮助(无需处理适配器中的每个项目点击?? 谢谢

【问题讨论】:

    标签: java android performance android-studio android-recyclerview


    【解决方案1】:

    Recycler 根据您的WordList 显示视图。

    所以要重置,通过mWordList.clear();清除LinkedList中的数据并通过调用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);
    }
    

    额外

    1. 不要使用LinkedList 来存储数据。相反,您可以使用适合大多数用例的ArrayList

    【讨论】:

    • clear(); 方法清除了LinkedList 中的所有单词。注意LinkedList在ActivityonCreate()中包含20个TextViews
    • 点击fab 添加新词后,我想重置 RecyclerView最初存在的 20 个词
    • 非常感谢@Pavan Varma...成功了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2021-01-15
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多