Java 如何在android中使用recyclerview和Database将位置相关的对象数据从一个活动传递到另一个活动
我已经创建了recycerview,当我按下+按钮时,此recycerview显示人物图像、人名和+按钮将按钮图像更改为true。recycerview底部一个按钮后,此按钮单击所有数据显示下一个活动 我的适配器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
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);可能是,
上下文
将为空。您是否创建了saparateBuildCustomAdapter
文件,还是在您的活动
中?saparate BuildCustomAdapter文件中。然后在BuildCustomAdapter
文件中传递上下文对象。修改您的BuildCustomAdapter
构造函数,如下:- public BuildCustomAdapter(List buildList,Context Context){this.Context=Context;this.buildList=buildList;thi