Java Recyclerview更新数据,但Recyclerview会以冻结方式滚动

Java Recyclerview更新数据,但Recyclerview会以冻结方式滚动,java,android,android-recyclerview,Java,Android,Android Recyclerview,当在设置活动中打开“仅显示选中的复选框”并且我的列表包含近30个项目时,recyclerview正常滚动,但当我使用包含900个项目的列表时,recyclerview滚动并冻结。我更新recyclerview的方法哪里错了? Android Studio日志: E/RecyclerView: No adapter attached; skipping layout I/Choreographer: Skipped 68 frames! The application may be doing

当在设置活动中打开“仅显示选中的复选框”并且我的列表包含近30个项目时,recyclerview正常滚动,但当我使用包含900个项目的列表时,recyclerview滚动并冻结。我更新recyclerview的方法哪里错了? Android Studio日志:

E/RecyclerView: No adapter attached; skipping layout
I/Choreographer: Skipped 68 frames!  The application may be doing too much work on its main thread.
自行车适配器:

public class BikesAdapter extends RecyclerView.Adapter<BikesAdapter.BikesViewHolder>{
    private static final String PREFS_NAME = "bikes_prefs";

    public static List<Categories> categories;
    private Context context;

    public BikesAdapter(Context context) {
        this.context = context;
        notifyDataSetChanged();
    }

    @Override
    public BikesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new BikesViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_bikes, parent, false));
    }

    @Override
    public void onBindViewHolder(final BikesViewHolder holder, final int position) {

        final SharedPreferences setFavoritesCnB = FragmentBikesListXT.context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        boolean isFavoriteChB = setFavoritesCnB.getBoolean(categories.get(position).title, false);
        holder.cbStars.setChecked(isFavoriteChB);

        holder.cbStars.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = setFavoritesCnB.edit();
                editor.putBoolean(categories.get(position).title, holder.cbStars.isChecked());
                editor.apply();
                if (holder.cbStars.isChecked()) {
                    openDBHelper.save(position);
                    Constants.CATEGORIES.add(categories.get(position));
                } else {
                    openDBHelper.delete(position);
                    Constants.CATEGORIES.remove(categories.get(position));
                }
            }
        });

        if (checkSwitch) {
            if (!isFavoriteChB) {
                holder.cardView.setVisibility(View.GONE);
            } else {
                holder.textTitle.setText(categories.get(position).title);
            }

        } else holder.textTitle.setText(categories.get(position).title);

        holder.textTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(categories.get(position).link));
                context.startActivity(intent);
            }
        });
    }

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

    public class BikesViewHolder extends RecyclerView.ViewHolder {

        private CardView cardView;
        private CheckBox cbStars;
        private TextView textTitle;

        public BikesViewHolder(View itemView) {
            super(itemView);

            cardView = (CardView) itemView.findViewById(R.id.cardView);
            cbStars = (CheckBox) itemView.findViewById(R.id.cbStars);
            textTitle = (TextView) itemView.findViewById(R.id.tv_title_bike);
        }
    }
}
设置活动性:

public class SettingsActivity extends AppCompatActivity {

    private Switch mSwitch;
    public static boolean checkSwitch;
    public static final String PREFS_LIST = "list_prefs";
    public static Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        mSwitch = (Switch) findViewById(R.id.switch_list);
        SharedPreferences setSwitch = getSharedPreferences(PREFS_LIST, MODE_PRIVATE);
        mSwitch.setChecked(setSwitch.getBoolean("NameOfThingToSave", false));

        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                if(isChecked){
                    checkSwitch = true;
                    SharedPreferences.Editor editor = getSharedPreferences(PREFS_LIST, MODE_PRIVATE).edit();
                    editor.putBoolean("NameOfThingToSave", true);
                    editor.commit();

                }else{
                    checkSwitch = false;
                    SharedPreferences.Editor editor = getSharedPreferences(PREFS_LIST, MODE_PRIVATE).edit();
                    editor.putBoolean("NameOfThingToSave", false);
                    editor.commit();
                }

            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                super.onBackPressed();
                return true;
        }
        finish();
        return super.onOptionsItemSelected(item);
    }
}
OpenDBHelper:

public class OpenDBHelper implements IDBHelper {
    private SQLiteDatabase db;

    @Override
    public void read() {
        db = FragmentBikesListXT.dbHelper.getWritableDatabase();
        BikesAdapter.categories.clear();

        Cursor c = db.query(Constants.TABLE_BIKE, null, null, null, null, null, null);

        if (c.moveToFirst()) {
            int titleColIndex = c.getColumnIndex(Constants.FIELD_TITLE);
            int linkColIndex = c.getColumnIndex(Constants.FIELD_LINK);

            do {
                BikesAdapter.categories.add(new Categories(
                        c.getString(titleColIndex),
                        c.getString(linkColIndex)));

                Log.d("DBHelper", "READ ID = " + c.getString(titleColIndex));

            } while (c.moveToNext());

        } else
            c.close();
    }

    @Override
    public void save(int position) {
        ContentValues cv = new ContentValues();
        db = FragmentBikesListXT.dbHelper.getWritableDatabase();
        cv.put(Constants.FIELD_TITLE, BikesAdapter.categories.get(position).title);
        cv.put(Constants.FIELD_LINK, BikesAdapter.categories.get(position).link);

        long size = db.insert(Constants.TABLE_BIKE, null, cv);
        Log.d("DBHelper", "SAVE row inserted, size " + size + " ID = , " + BikesAdapter.categories.get(position).title);

        FragmentBikesListXT.dbHelper.close();
    }

    @Override
    public void delete(int position) {
        db = FragmentBikesListXT.dbHelper.getWritableDatabase();

        String[] whereArgs = {String.valueOf(BikesAdapter.categories.get(position).title)};
        db.delete(Constants.TABLE_BIKE, Constants.FIELD_TITLE + " = ?", whereArgs);

        Log.d("DBHelper", "DELETE ID = " + BikesAdapter.categories.get(position).title);

        db.close();
    }
}
和解析器类:

public class ParseXT {
    private static Elements titleTxt;
    private static Elements linkTxt;

    private static ArrayList<String> titleList = new ArrayList<>();
    private static ArrayList<String> linkList = new ArrayList<>();

    public static BikesAdapter bikesAdapter = new BikesAdapter(FragmentBikesListXT.context);

    public static void initializeData(String url) {

        new NewTreadParsed(url).execute();
    }

    public static class NewTreadParsed extends AsyncTask<List<Categories>, Void, List<Categories>> {
        private String url;

        public NewTreadParsed(String url) {
            this.url = url;
        }

        @Override
        protected List<Categories> doInBackground(List<Categories>... params) {
            Document doc;
            List<Categories> categories = new ArrayList<>();
            try {
                doc = Jsoup.connect(url).get();
                titleTxt = doc.select(".topictitle");
                linkTxt = doc.select(".a[href]");

                titleList.clear();
                linkList.clear();

                for (Element contents : titleTxt) {
                    titleList.add(contents.text());
                }

                for (Element contents1 : titleTxt) {
                    Element element = contents1.select("a[href]").first();
                    linkList.add(element.attr("abs:href"));
                }
            }
            catch (IOException e){
                e.printStackTrace();
            }
            for (int i = 0; i < titleList.size(); i++) {
                categories.add(new Categories(titleList.get(i), linkList.get(i)));
            }
            return categories;
        }

        @Override
        protected void onPostExecute(List<Categories> categories) {
            super.onPostExecute(categories);
            FragmentBikesListXT.pbBikes.setVisibility(ProgressBar.INVISIBLE);
            BikesAdapter.categories = categories;
            FragmentBikesListXT.rvBikes.setAdapter(bikesAdapter);
        }
    }
}
公共类ParseXT{ 私有静态元素titleTxt; 私有静态元素linkTxt; 私有静态ArrayList titleList=新ArrayList(); 私有静态ArrayList linkList=新ArrayList(); public static BikesAdapter BikesAdapter=新的BikesAdapter(FragmentBikesListXT.context); 公共静态void初始化数据(字符串url){ 新建NewReadParsed(url).execute(); } 公共静态类NewTreadParsed扩展异步任务{ 私有字符串url; 公共NewTreadParsed(字符串url){ this.url=url; } @凌驾 受保护列表doInBackground(列表…参数){ 文件文件; 列表类别=新建ArrayList(); 试一试{ doc=Jsoup.connect(url.get(); titleTxt=doc.select(“.topictitle”); linkTxt=doc.select(“.a[href]”); 标题列表。清除(); linkList.clear(); for(元素内容:titleTxt){ titleList.add(contents.text()); } for(元素内容1:titleTxt){ Element=contents1.select(“a[href]”).first(); linkList.add(element.attr(“abs:href”); } } 捕获(IOE异常){ e、 printStackTrace(); } 对于(int i=0;i使用notifyDataSetChanged() 如果您正在编写一个适配器,那么如果可以的话,使用更具体的更改事件总是会更有效。依赖notifyDataSetChanged()

使用notifyDataSetChanged()
如果您正在编写一个适配器,那么如果可以的话,使用更具体的更改事件总是会更有效。依赖notifyDataSetChanged()

但我在适配器中使用了notifyDataSetChanged(),但在适配器中使用了notifyDataSetChanged()
public class ParseXT {
    private static Elements titleTxt;
    private static Elements linkTxt;

    private static ArrayList<String> titleList = new ArrayList<>();
    private static ArrayList<String> linkList = new ArrayList<>();

    public static BikesAdapter bikesAdapter = new BikesAdapter(FragmentBikesListXT.context);

    public static void initializeData(String url) {

        new NewTreadParsed(url).execute();
    }

    public static class NewTreadParsed extends AsyncTask<List<Categories>, Void, List<Categories>> {
        private String url;

        public NewTreadParsed(String url) {
            this.url = url;
        }

        @Override
        protected List<Categories> doInBackground(List<Categories>... params) {
            Document doc;
            List<Categories> categories = new ArrayList<>();
            try {
                doc = Jsoup.connect(url).get();
                titleTxt = doc.select(".topictitle");
                linkTxt = doc.select(".a[href]");

                titleList.clear();
                linkList.clear();

                for (Element contents : titleTxt) {
                    titleList.add(contents.text());
                }

                for (Element contents1 : titleTxt) {
                    Element element = contents1.select("a[href]").first();
                    linkList.add(element.attr("abs:href"));
                }
            }
            catch (IOException e){
                e.printStackTrace();
            }
            for (int i = 0; i < titleList.size(); i++) {
                categories.add(new Categories(titleList.get(i), linkList.get(i)));
            }
            return categories;
        }

        @Override
        protected void onPostExecute(List<Categories> categories) {
            super.onPostExecute(categories);
            FragmentBikesListXT.pbBikes.setVisibility(ProgressBar.INVISIBLE);
            BikesAdapter.categories = categories;
            FragmentBikesListXT.rvBikes.setAdapter(bikesAdapter);
        }
    }
}