Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
673 views
in Technique[技术] by (71.8m points)

android - how to get ID of the items in recyclerview

i'm using slide to delete from recyclerview but the problem comes when getAdapterPosition() doesn't match with the row_id of sql table. how can i get id from the adapter and how to update recyclerview when the data is added(it doesn't display new data until i reopen the app or change orientation) ?

public class MainActivity extends AppCompatActivity {

RecyclerView mRecyclerView;
MyAdapter myAdapter;
ImageButton floatButton;

DbHelper dbHelper;

ArrayList<Information> data;


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


    floatButton = (ImageButton) findViewById(R.id.imageButton);
    floatButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, AddDetailPage.class);
            MainActivity.this.startActivity(intent);
        }
    });


    dbHelper = new DbHelper(this);

    data = new ArrayList<>();

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    myAdapter = new MyAdapter(this, showData());


    mRecyclerView.setAdapter(myAdapter);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));


    ItemTouchHelper helper = new ItemTouchHelper(createHelperCallback());
    helper.attachToRecyclerView(mRecyclerView);
}

private ItemTouchHelper.Callback createHelperCallback() {
    ItemTouchHelper.SimpleCallback simpleItemCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT |
            ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            deleteItem(viewHolder.getAdapterPosition());
        }
    };
    return simpleItemCallback;
}


public ArrayList<Information> showData() {
    Cursor res = dbHelper.showData();
    while (res.moveToNext()) {
        Information information = new Information();
        information.ID = res.getString(0);
        information.first = res.getString(0);
        information.second = res.getString(2);
        information.detail = res.getString(3);
        data.add(information);
    }
    return data;
}

public void deleteItem(int position){
    DbHelper dbHelper = new DbHelper(this);
    dbHelper.delete(position);


    myAdapter.notifyItemRemoved(position);

    myAdapter.delete(position);
}

}

public class MyAdapter extends RecyclerView.Adapter {

private MainActivity mainactivity;
private ArrayList<Information> data;
private LayoutInflater layoutInflater;

public MyAdapter(MainActivity mainActivity, ArrayList<Information> information) {
    this.mainactivity = mainActivity;
    this.data = information;
    layoutInflater = LayoutInflater.from(mainActivity);
    notifyDataSetChanged();
}


@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = layoutInflater.inflate(R.layout.list_item, parent, false);
    return new ViewHolder(view, data);
}


@Override
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) {
    holder.first.setText(data.get(position).first);
    holder.second.setText(data.get(position).second);
    holder.detail.setText(data.get(position).detail);

}

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

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView first, second, detail;
    ArrayList<Information> info;


    public ViewHolder(View itemView, ArrayList<Information> data) {
        super(itemView);

        this.info = data;

        first = (TextView) itemView.findViewById(R.id.firstText);
        second = (TextView) itemView.findViewById(R.id.secondText);
        detail = (TextView) itemView.findViewById(R.id.detail);
    }

}

public void delete(int x){
    data.remove(x);
    notifyDataSetChanged();
}

}

public class DbHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "students.db";
public static final String TABLE_NAME = "student_table";
public static final String ID = "_id";
public static final String FIRST_NAME = "first_name";
public static final String SECOND_NAME = "second_name";
public static final String DETAIL = "detail";

public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + "( " + ID + " INTEGER PRIMARY KEY AUTOINCREMENT ," + FIRST_NAME + " TEXT ," + SECOND_NAME + " TEXT ," + DETAIL + " TEXT );");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean insertData(String first, String second, String detail) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put(FIRST_NAME, first);
    contentValues.put(SECOND_NAME, second);
    contentValues.put(DETAIL, detail);
    long x = db.insert(TABLE_NAME, null, contentValues);

    if (x == -1) {
        return false;
    } else {
        return true;
    }


}

public Cursor showData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
    return res;
}

public void delete(int x) {
    int y = x + 1;
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME, ID + "=" + y, null);
}

}

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Create this method in your adapter to the get id of that specific object and pass the id to the delete the fuction of DbHelper class.

int getId(int position){
    return data.get(position).ID;
}

And avoid accessing the members of a class directly. Instead of that you can use getter and setter methods.

And for updating the recyclerview after adding new data you can call notifyDataSetChanged() in the respective insert method in your adapter.

EDIT:

To add a new element into your recycler view add this method in your adapter

void addItem(Informationn infoObj){
     data.add(infoObj);
     notifyDataSetChanged();
}

Call this method using your adapter object and pass the new item as parameter and your recyclerview will be updated with the new items


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...