Android 适配器没有';垃圾回收商

Android 适配器没有';垃圾回收商,android,Android,我对回收器有一个问题,问题是:我有一个AsyncTask,它从我的数据库中查询数据,然后通过CursorLoader更新回收器,但适配器并没有填充回收器,日志说数据库中的数据正在成功读取,然后适配器构造函数成功地获取带有数据的ArrayList,仅此而已,日志显示适配器的方法不调用 主要活动: public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor

我对回收器有一个问题,问题是:我有一个AsyncTask,它从我的数据库中查询数据,然后通过CursorLoader更新回收器,但适配器并没有填充回收器,日志说数据库中的数据正在成功读取,然后适配器构造函数成功地获取带有数据的ArrayList,仅此而已,日志显示适配器的方法不调用

主要活动

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {


private SQLiteDatabase db;
private SimpleCursorLoader loader;
private MySimpleAdapter adapter;
private RecyclerView recycler;

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

    recycler = (RecyclerView) findViewById(R.id.recycler);

    new SimpleTask(SimpleTask.OPEN, null).execute();
}

private class SimpleTask extends AsyncTask<Void, Void, Void> {

    public static final int INSERT = 0;
    public static final int DELETE = 1;
    public static final int OPEN = 2;
    private int task;
    private String name;

    public SimpleTask(int task, String name) {
        this.task = task;
        this.name = name;
    }

    @Override
    protected Void doInBackground(Void... params) {
        switch (task) {
            case INSERT :
                ContentValues values = new ContentValues();
                values.put(SimpleHelper.KEY_NAME, name);
                db.insert(SimpleHelper.TABLE_NAME, null, values);
                break;
            case DELETE :
                db.delete(SimpleHelper.TABLE_NAME, SimpleHelper.KEY_NAME + " = ? ", new String[]{name});
                break;
            case OPEN :
                if (db == null) {
                    try {
                        db = new SimpleHelper(MainActivity.this).getWritableDatabase();
                    } catch (SQLiteException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        if (loader == null) {
            loader = new SimpleCursorLoader(MainActivity.this, db);
            loader.setQueryParams(SimpleHelper.TABLE_NAME, new String[]{SimpleHelper.KEY_NAME},
                    null, null);
            getSupportLoaderManager().initLoader(0, null, MainActivity.this);
        }
        getSupportLoaderManager().getLoader(0).forceLoad();
    }
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return loader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    Log.i("MyLog", "onLoadFinished cursor size is " + data.getCount());
    List<String> items = new ArrayList<>();
    data.moveToFirst();
    do {
        items.add(data.getString(0));
        Log.i("MyLog", data.getString(0));
    } while (data.moveToNext());

    Log.i("MyLog", "onLoadFinished items size is " + items.size());

    if (adapter == null) {
        adapter = new MySimpleAdapter(items);
        recycler.setAdapter(adapter);
    } else {
        adapter.updateAdapter(items);
    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {

}

private class MySimpleAdapter extends RecyclerView.Adapter<MySimpleAdapter.MyHolder> {

    private List<String> items;

    public MySimpleAdapter(List<String> items) {
        Log.i("MyLog", "Constructor called with items size " + items.size());
        this.items = items;
    }

    public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView tvText;

        public MyHolder(View itemView) {
            super(itemView);
            tvText = (TextView) itemView.findViewById(android.R.id.text1);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            new SimpleTask(SimpleTask.DELETE, tvText.getText().toString());
        }
    }

    public void updateAdapter(List<String> items) {
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.i("MyLog", "onCreateViewHolder");
        View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null, false);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.tvText.setText(items.get(position));
        Log.i("MyLog", "onBindViewHolder setText : " + items.get(position));
    }

    @Override
    public int getItemCount() {
        Log.d("MyLog", "getItemCount called with size : " + items.size());
        return items.size();
    }
}
public class SimpleHelper extends SQLiteOpenHelper{

public static final String TABLE_NAME = "users";
public static final String KEY_NAME = "name";
public static final String KEY_ID = "_id";
private static final int DB_VERSION = 1;
private static final String DB_NAME = "SimpleDB";

public SimpleHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + "("
    + KEY_ID + " integer primary key autoincrement, "
    + KEY_NAME + " text)");
    for (int i = 0; i < 5; i ++) {
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, "name" + i+1);
        db.insert(TABLE_NAME, null, values);
        Log.i("MyLog", "inserted");
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
DBHelper

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {


private SQLiteDatabase db;
private SimpleCursorLoader loader;
private MySimpleAdapter adapter;
private RecyclerView recycler;

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

    recycler = (RecyclerView) findViewById(R.id.recycler);

    new SimpleTask(SimpleTask.OPEN, null).execute();
}

private class SimpleTask extends AsyncTask<Void, Void, Void> {

    public static final int INSERT = 0;
    public static final int DELETE = 1;
    public static final int OPEN = 2;
    private int task;
    private String name;

    public SimpleTask(int task, String name) {
        this.task = task;
        this.name = name;
    }

    @Override
    protected Void doInBackground(Void... params) {
        switch (task) {
            case INSERT :
                ContentValues values = new ContentValues();
                values.put(SimpleHelper.KEY_NAME, name);
                db.insert(SimpleHelper.TABLE_NAME, null, values);
                break;
            case DELETE :
                db.delete(SimpleHelper.TABLE_NAME, SimpleHelper.KEY_NAME + " = ? ", new String[]{name});
                break;
            case OPEN :
                if (db == null) {
                    try {
                        db = new SimpleHelper(MainActivity.this).getWritableDatabase();
                    } catch (SQLiteException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        if (loader == null) {
            loader = new SimpleCursorLoader(MainActivity.this, db);
            loader.setQueryParams(SimpleHelper.TABLE_NAME, new String[]{SimpleHelper.KEY_NAME},
                    null, null);
            getSupportLoaderManager().initLoader(0, null, MainActivity.this);
        }
        getSupportLoaderManager().getLoader(0).forceLoad();
    }
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return loader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    Log.i("MyLog", "onLoadFinished cursor size is " + data.getCount());
    List<String> items = new ArrayList<>();
    data.moveToFirst();
    do {
        items.add(data.getString(0));
        Log.i("MyLog", data.getString(0));
    } while (data.moveToNext());

    Log.i("MyLog", "onLoadFinished items size is " + items.size());

    if (adapter == null) {
        adapter = new MySimpleAdapter(items);
        recycler.setAdapter(adapter);
    } else {
        adapter.updateAdapter(items);
    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {

}

private class MySimpleAdapter extends RecyclerView.Adapter<MySimpleAdapter.MyHolder> {

    private List<String> items;

    public MySimpleAdapter(List<String> items) {
        Log.i("MyLog", "Constructor called with items size " + items.size());
        this.items = items;
    }

    public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView tvText;

        public MyHolder(View itemView) {
            super(itemView);
            tvText = (TextView) itemView.findViewById(android.R.id.text1);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            new SimpleTask(SimpleTask.DELETE, tvText.getText().toString());
        }
    }

    public void updateAdapter(List<String> items) {
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.i("MyLog", "onCreateViewHolder");
        View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null, false);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.tvText.setText(items.get(position));
        Log.i("MyLog", "onBindViewHolder setText : " + items.get(position));
    }

    @Override
    public int getItemCount() {
        Log.d("MyLog", "getItemCount called with size : " + items.size());
        return items.size();
    }
}
public class SimpleHelper extends SQLiteOpenHelper{

public static final String TABLE_NAME = "users";
public static final String KEY_NAME = "name";
public static final String KEY_ID = "_id";
private static final int DB_VERSION = 1;
private static final String DB_NAME = "SimpleDB";

public SimpleHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + "("
    + KEY_ID + " integer primary key autoincrement, "
    + KEY_NAME + " text)");
    for (int i = 0; i < 5; i ++) {
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, "name" + i+1);
        db.insert(TABLE_NAME, null, values);
        Log.i("MyLog", "inserted");
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
公共类SimpleHelper扩展了SQLiteOpenHelper{
公共静态最终字符串表\u NAME=“users”;
公共静态最终字符串键\u NAME=“NAME”;
公共静态最终字符串键\u ID=“\u ID”;
私有静态最终int DB_版本=1;
私有静态最终字符串DB_NAME=“SimpleDB”;
公共SimpleHelper(上下文){
super(上下文,数据库名称,空,数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
db.execSQL(“创建表”+表名+”(“
+KEY_ID+“整数主键自动递增,”
+键(名称+“文本)”);
对于(int i=0;i<5;i++){
ContentValues=新的ContentValues();
值。put(键名称,“名称”+i+1);
db.insert(表名称,空,值);
Log.i(“MyLog”,“插入”);
}
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
}
活动\u main.xml

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {


private SQLiteDatabase db;
private SimpleCursorLoader loader;
private MySimpleAdapter adapter;
private RecyclerView recycler;

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

    recycler = (RecyclerView) findViewById(R.id.recycler);

    new SimpleTask(SimpleTask.OPEN, null).execute();
}

private class SimpleTask extends AsyncTask<Void, Void, Void> {

    public static final int INSERT = 0;
    public static final int DELETE = 1;
    public static final int OPEN = 2;
    private int task;
    private String name;

    public SimpleTask(int task, String name) {
        this.task = task;
        this.name = name;
    }

    @Override
    protected Void doInBackground(Void... params) {
        switch (task) {
            case INSERT :
                ContentValues values = new ContentValues();
                values.put(SimpleHelper.KEY_NAME, name);
                db.insert(SimpleHelper.TABLE_NAME, null, values);
                break;
            case DELETE :
                db.delete(SimpleHelper.TABLE_NAME, SimpleHelper.KEY_NAME + " = ? ", new String[]{name});
                break;
            case OPEN :
                if (db == null) {
                    try {
                        db = new SimpleHelper(MainActivity.this).getWritableDatabase();
                    } catch (SQLiteException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        if (loader == null) {
            loader = new SimpleCursorLoader(MainActivity.this, db);
            loader.setQueryParams(SimpleHelper.TABLE_NAME, new String[]{SimpleHelper.KEY_NAME},
                    null, null);
            getSupportLoaderManager().initLoader(0, null, MainActivity.this);
        }
        getSupportLoaderManager().getLoader(0).forceLoad();
    }
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return loader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    Log.i("MyLog", "onLoadFinished cursor size is " + data.getCount());
    List<String> items = new ArrayList<>();
    data.moveToFirst();
    do {
        items.add(data.getString(0));
        Log.i("MyLog", data.getString(0));
    } while (data.moveToNext());

    Log.i("MyLog", "onLoadFinished items size is " + items.size());

    if (adapter == null) {
        adapter = new MySimpleAdapter(items);
        recycler.setAdapter(adapter);
    } else {
        adapter.updateAdapter(items);
    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {

}

private class MySimpleAdapter extends RecyclerView.Adapter<MySimpleAdapter.MyHolder> {

    private List<String> items;

    public MySimpleAdapter(List<String> items) {
        Log.i("MyLog", "Constructor called with items size " + items.size());
        this.items = items;
    }

    public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView tvText;

        public MyHolder(View itemView) {
            super(itemView);
            tvText = (TextView) itemView.findViewById(android.R.id.text1);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            new SimpleTask(SimpleTask.DELETE, tvText.getText().toString());
        }
    }

    public void updateAdapter(List<String> items) {
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.i("MyLog", "onCreateViewHolder");
        View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null, false);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
        holder.tvText.setText(items.get(position));
        Log.i("MyLog", "onBindViewHolder setText : " + items.get(position));
    }

    @Override
    public int getItemCount() {
        Log.d("MyLog", "getItemCount called with size : " + items.size());
        return items.size();
    }
}
public class SimpleHelper extends SQLiteOpenHelper{

public static final String TABLE_NAME = "users";
public static final String KEY_NAME = "name";
public static final String KEY_ID = "_id";
private static final int DB_VERSION = 1;
private static final String DB_NAME = "SimpleDB";

public SimpleHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + "("
    + KEY_ID + " integer primary key autoincrement, "
    + KEY_NAME + " text)");
    for (int i = 0; i < 5; i ++) {
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, "name" + i+1);
        db.insert(TABLE_NAME, null, values);
        Log.i("MyLog", "inserted");
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

使用此选项

recycler.setLayoutManager(new LinearLayoutManager(this)); 
recycler.setHasFixedSize(true);
recycler.setNestedScrollingEnabled(false);

谢谢,我忘了设置LayoutManager,真是难以忍受