Java 如何在android中使用recyclerview和Database将位置相关的对象数据从一个活动传递到另一个活动

Java 如何在android中使用recyclerview和Database将位置相关的对象数据从一个活动传递到另一个活动,java,android,database,listview,android-recyclerview,Java,Android,Database,Listview,Android Recyclerview,我已经创建了recycerview,当我按下+按钮时,此recycerview显示人物图像、人名和+按钮将按钮图像更改为true。recycerview底部一个按钮后,此按钮单击所有数据显示下一个活动 我的适配器 public class BuildCustomAdapter extends RecyclerView.Adapter<BuildCustomAdapter.MyViewHolder> implements Filterable { private List<Peo

我已经创建了recycerview,当我按下+按钮时,此recycerview显示人物图像、人名和+按钮将按钮图像更改为true。recycerview底部一个按钮后,此按钮单击所有数据显示下一个活动

我的适配器

public class BuildCustomAdapter extends RecyclerView.Adapter<BuildCustomAdapter.MyViewHolder> implements Filterable {
private List<People> peopleList;
private List<People> peopleListCopy;


private ItemFilter mFilter = new ItemFilter();

public BuildCustomAdapter(List<People> buildList) {
    this.peopleList = buildList;
    this.peopleListCopy = new ArrayList<>();
    peopleListCopy.addAll(buildList);
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.build_list_row, parent, false);

    return new MyViewHolder(itemView);
}

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

    People people = peopleList.get(position);

    byte[] decodedString = Base64.decode(people.getPeopleImage(), Base64.DEFAULT);
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

    holder.ivPeopleImage.setImageBitmap(decodedByte);
    holder.tvPersonName.setText(people.getPeopleName());

    holder.button.setSelected(people.isSelected());
    holder.button.setOnClickListener(new onSelectListener(position));
}

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

@Override
public Filter getFilter() {
    if (mFilter == null) {
        mFilter = new ItemFilter();
    }
    return mFilter;
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    // public ImageView ivPeopleImage;
    public TextView tvPersonName;
    public Button button;
    public CircularImageView ivPeopleImage;

    public MyViewHolder(View itemView) {
        super(itemView);
        ivPeopleImage = (CircularImageView) itemView.findViewById(R.id.ivPerson);
        tvPersonName = (TextView) itemView.findViewById(R.id.tvPersonName);
        button = (Button) itemView.findViewById(R.id.addbn);
    }
}

private class ItemFilter extends Filter {

    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
        if (constraint != null && constraint.length() > 0) {
            List<People> filterList = new ArrayList<>();


            for (int i = 0; i < peopleListCopy.size(); i++) {
                if ((peopleListCopy.get(i).getPeopleName().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {

                    People peopleName = peopleListCopy.get(i);
                    filterList.add(peopleName);
                }
            }
            results.count = filterList.size();
            results.values = filterList;

        } else {
            results.count = peopleListCopy.size();
            results.values = peopleListCopy;
        }
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        peopleList = (List<People>) results.values;
        notifyDataSetChanged();
    }

}

private class onSelectListener implements View.OnClickListener {

    int mPosition;

    public onSelectListener(int position) {
        mPosition = position;
    }

    @Override
    public void onClick(View view) {
        view.setSelected(!view.isSelected());
        People people = peopleList.get(mPosition);
        people.setSelected(!people.isSelected());
        notifyDataSetChanged();
    }
}
DatabaseHelper.class

public class People  implements Serializable {
private String peopleImage;
private String peopleName;
private boolean selected;


public void setPeopleName(String peopleName) {
    this.peopleName = peopleName;
}

public String getPeopleName() {
    return peopleName;
}

public void setPeopleImage(String peopleImage) {
    this.peopleImage = peopleImage;
}

public String getPeopleImage() {
    return peopleImage;
}

public boolean isSelected() {
    return selected;
}
public void setSelected(boolean selected) {
    this.selected = selected;
}
public class DataBaseHelper extends SQLiteOpenHelper {
private static final String DB_PATH = "/data/data/databasename/databases/";
private static final String DB_NAME = "alertme.db";
private final String TABLE_PEOPLE = "people";
private final String TABLE_CATEGORY = "category";
private final String CATEGORY_NAME = "name";
private final String ID = "id";
private final String CATEGORY_ID = "category_id";
private final String PEOPLE_IMAGE = "image";
private final String PEOPLE_NAME = "name";
private SQLiteDatabase myDataBase;

private final Context myContext;

public DataBaseHelper(Context context) {
    super(context, DB_NAME, null, 1);

    this.myContext = context;
}

public void createDataBase() throws IOException {

    boolean dbExist = checkDataBase();
    if (dbExist) {
    } else {

        this.getReadableDatabase();

        try {
            copyDataBase();
        } catch (IOException e) {

            throw new Error("Error copying database");

        }
    }
}

private boolean checkDataBase() {

    SQLiteDatabase checkDB = null;

    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    } catch (SQLiteException e) {

    }

    if (checkDB != null) {

        checkDB.close();

    }

    return checkDB != null ? true : false;
}

private void copyDataBase() throws IOException {

    InputStream myInput = myContext.getAssets().open(DB_NAME);

    String outFileName = DB_PATH + DB_NAME;

    OutputStream myOutput = new FileOutputStream(outFileName);

    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    myOutput.flush();
    myOutput.close();
    myInput.close();

}

public boolean open() {
    try {
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        return true;
    } catch (SQLException sqle) {
        myDataBase = null;
        return false;
    }
}


public List<People> getPeople(String category_id) {
    List<People> peoples = new ArrayList<>();
    try {
        SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READWRITE);

        Cursor cursor = db.rawQuery("select * from people where category_id = " + category_id, null);

        while (cursor.moveToNext()) {
            String peopleName = cursor.getString(cursor.getColumnIndex(PEOPLE_NAME));
            String peopleImage = cursor.getString(cursor.getColumnIndex(PEOPLE_IMAGE));

            People people = new People();
            people.setPeopleName(peopleName);
            people.setPeopleImage(peopleImage);

            peoples.add(people);
        }

    } catch (Exception e) {
        Log.d("DB", e.getMessage());
    }
    return peoples;
}

public List<Category> getCategory() {
    List<Category> categoryList = new ArrayList<>();
    try {

        String query = " SELECT * FROM " + TABLE_CATEGORY;
        SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READWRITE);
        Cursor cursor = db.rawQuery(query, null);
        while (cursor.moveToNext()) {
            int categoryID = cursor.getInt(cursor.getColumnIndex(ID));
            String categoryName = cursor.getString(cursor.getColumnIndex(CATEGORY_NAME));

            Category category = new Category();
            category.setId(categoryID);
            category.setCategoryName(categoryName);

            categoryList.add(category);

        }

    } catch (Exception e) {
        Log.d("DB", e.getMessage());
    }

    return categoryList;
}

@Override
public synchronized void close() {

    if (myDataBase != null)
        myDataBase.close();

    super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}
public类DataBaseHelper扩展了SQLiteOpenHelper{
私有静态最终字符串DB_PATH=“/data/data/databasename/databases/”;
私有静态最终字符串DB_NAME=“alertme.DB”;
私有最终字符串表_PEOPLE=“PEOPLE”;
私有最终字符串表\u CATEGORY=“CATEGORY”;
私有最终字符串类别\u NAME=“NAME”;
私有最终字符串ID=“ID”;
私有最终字符串CATEGORY\u ID=“CATEGORY\u ID”;
私有最终字符串PEOPLE\u IMAGE=“IMAGE”;
私有最终字符串PEOPLE\u NAME=“NAME”;
私有SQLiteDatabase-myDataBase;
私有最终上下文myContext;
公共数据库助手(上下文){
super(上下文,DB_名称,null,1);
this.myContext=上下文;
}
public void createDataBase()引发IOException{
布尔值dbExist=checkDataBase();
if(dbExist){
}否则{
这是.getReadableDatabase();
试一试{
copyDataBase();
}捕获(IOE异常){
抛出新错误(“复制数据库时出错”);
}
}
}
私有布尔校验数据库(){
SQLiteDatabase checkDB=null;
试一试{
字符串myPath=DB_PATH+DB_NAME;
checkDB=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN\u READONLY);
}catch(sqlitee异常){
}
if(checkDB!=null){
checkDB.close();
}
return checkDB!=null?true:false;
}
私有void copyDataBase()引发IOException{
InputStream myInput=myContext.getAssets().open(DB_NAME);
字符串outFileName=DB_路径+DB_名称;
OutputStream myOutput=新文件OutputStream(outFileName);
字节[]缓冲区=新字节[1024];
整数长度;
而((长度=myInput.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
公共布尔开放(){
试一试{
字符串myPath=DB_PATH+DB_NAME;
myDataBase=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN\u READWRITE);
返回true;
}捕获(SQLException sqle){
myDataBase=null;
返回false;
}
}
公共列表getPeople(字符串类别\u id){
List people=new ArrayList();
试一试{
SQLiteDatabase db=SQLiteDatabase.openDatabase(db\u路径+db\u名称,null,SQLiteDatabase.OPEN\u读写);
Cursor Cursor=db.rawQuery(“从人员中选择*,其中category_id=“+category_id,null”);
while(cursor.moveToNext()){
String peopleName=cursor.getString(cursor.getColumnIndex(人名));
String peopleImage=cursor.getString(cursor.getColumnIndex(PEOPLE\u IMAGE));
人=新人();
peopleName(peopleName);
people.setPeopleImage(peopleImage);
人民。添加(人民);
}
}捕获(例外e){
Log.d(“DB”,e.getMessage());
}
返回人民;
}
公共列表getCategory(){
List categoryList=新建ArrayList();
试一试{
String query=“SELECT*FROM”+表格\类别;
SQLiteDatabase db=SQLiteDatabase.openDatabase(db\u路径+db\u名称,null,SQLiteDatabase.OPEN\u读写);
Cursor Cursor=db.rawQuery(查询,空);
while(cursor.moveToNext()){
int categoryID=cursor.getInt(cursor.getColumnIndex(ID));
String categoryName=cursor.getString(cursor.getColumnIndex(CATEGORY_NAME));
类别=新类别();
类别setId(类别ID);
category.setCategoryName(categoryName);
类别列表。添加(类别);
}
}捕获(例外e){
Log.d(“DB”,e.getMessage());
}
返回类别列表;
}
@凌驾
公共同步作废关闭(){
if(myDataBase!=null)
myDataBase.close();
super.close();
}
@凌驾
public void onCreate(SQLiteDatabase db){
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
}

在下面的方法中添加意图

    holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                build.setSelected(!build.isSelected());
                if (build.isSelected()) {
                    holder.button.setBackgroundResource(R.drawable.selected_true_icon_new);
    Intent intent = new Intent(context, youractivity.class)
    intenet.putExtra("key","value");
    context.startActivity(intent);
                } else
                    holder.button.setBackgroundResource(R.drawable.add_button_icon);
            }
        });

您注册到ViewHolder上的click事件的巨大错误!您将得到与实际不同的位置,因为当android使用notifyItemMoved时,viewBindHolder将不会被调用,并且您得到了错误的位置


在click listener实现中,您应该首先在
构建
模型类中实现
可序列化
接口,如下所示:-

public class Build implements Serializable{
   //Content will be as it is
}
holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                build.setSelected(!build.isSelected());
                if (build.isSelected()) {
                    holder.button.setBackgroundResource(R.drawable.selected_true_icon_new);
    Intent intent = new Intent(context, youractivity.class)
    intenet.putExtra("build",build);
    context.startActivity(intent);
                } else
                    holder.button.setBackgroundResource(R.drawable.add_button_icon);
            }
        });
按如下方式更改您的clickListener:-

public class Build implements Serializable{
   //Content will be as it is
}
holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                build.setSelected(!build.isSelected());
                if (build.isSelected()) {
                    holder.button.setBackgroundResource(R.drawable.selected_true_icon_new);
    Intent intent = new Intent(context, youractivity.class)
    intenet.putExtra("build",build);
    context.startActivity(intent);
                } else
                    holder.button.setBackgroundResource(R.drawable.add_button_icon);
            }
        });
在接收活动的
onCreate
方法中写入以下内容:-

Build build = (Build) getIntent().getSerializableExtra("build");

如何在下一个活动中获取模型数据?替换以下行:intenet.putExtra(“key”,build.getName());我已经替换了此行,但此数据将显示给本活动中的下一个活动如何显示?holder.imageView.setImageResource(build.getImages());holder.name.setText(build.getName());您必须在何处显示这些数据??在循环视图中??请解释我不知道,因为我在android中有更新鲜的版本?我尝试了您的代码,但在这一行的适配器中出现了一些错误,如java.lang.NullPointerException Intent Intent=new Intent(上下文,Temp.class);可能是,
上下文
将为空。您是否创建了saparate
BuildCustomAdapter
文件,还是在您的
活动
中?saparate BuildCustomAdapter文件中。然后在
BuildCustomAdapter
文件中传递上下文对象。修改您的
BuildCustomAdapter
构造函数,如下:-
 public BuildCustomAdapter(List buildList,Context Context){this.Context=Context;this.buildList=buildList;thi