繁体   English   中英

Java:每次删除项目时如何更新回收站视图?

[英]Java: How to update the Recycler View every time I delete an item?

我似乎被这个问题困住了,我想实时更新回收站视图。 这意味着当用户滑动删除一行时,我希望回收器视图更新其列表。 As you can see in the code below I have tried to use NotifyDataSetChange() in the DatabaseAdapter java class but I only get the error "RecyclerViewAdapter.notifyDataSetChanged() on a null object reference".

我已经搜索了上面的错误以及如何实时更新回收视图,但我发现没有一个解决方案有效。 请帮助我,因为我在这个问题上失去了它。

名称Adapter.Java

package com.example.myapplication.ui;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication.DatabaseAdapter;
import com.example.myapplication.R;

import org.w3c.dom.NameList;

import java.util.ArrayList;
import java.util.List;

public class NamesAdapter extends RecyclerView.Adapter<NamesAdapter.ViewHolder> {


    Context context;
    List<Names> namesList;
    RecyclerView rvPrograms;
    final View.OnClickListener onClickListener = new MyOnClickListner();

    public static class ViewHolder extends RecyclerView.ViewHolder{

        TextView rowID;
        TextView rowName;
        TextView rowAmount;
        TextView rowDate;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            //Store the item sub-views in member variables
            rowID = itemView.findViewById(R.id.idTextView);
            rowName = itemView.findViewById(R.id.nameTextView);
            rowAmount = itemView.findViewById(R.id.amountEditText);
            rowDate = itemView.findViewById(R.id.dateTextView);
        }
    }

    public NamesAdapter(Context context, List<Names> namesList, RecyclerView rvPrograms){
        this.context = context;
        this.namesList= namesList;
        this.rvPrograms = rvPrograms;
    }

    @NonNull
    @Override
    public NamesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.recycler_list, viewGroup, false);
        view.setOnClickListener(onClickListener);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull NamesAdapter.ViewHolder holder, int i) {

        Names name = namesList.get(i);
        holder.rowID.setText(""+name.getId());
        holder.rowName.setText(name.getName());
        holder.rowAmount.setText(name.getAmount());
        holder.rowDate.setText(name.getDate());
        holder.itemView.setTag(name.getId());
    }

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


    private class MyOnClickListner implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            int itemPosition = rvPrograms.getChildLayoutPosition(v);
            String item = namesList.get(itemPosition).getName();
            Toast.makeText(context, item, Toast.LENGTH_SHORT).show();

        }
    }

}

数据库适配器.Java

package com.example.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.myapplication.ui.Names;
import com.example.myapplication.ui.NamesAdapter;

import java.util.ArrayList;
import java.util.List;

public class DatabaseAdapter {

    DatabaseHelper helper;
    SQLiteDatabase db;
    List<Names> namesList = new ArrayList<>();
    NamesAdapter na;

    public DatabaseAdapter(Context context) {

        helper = new DatabaseHelper(context);
        db = helper.getWritableDatabase();
    }
    public int deleteData(String name){
        String whereArgs[] = {name};
        int count = db.delete(DatabaseHelper.Table_Name, DatabaseHelper.Key_Name+ "=?", whereArgs);
        return count;
    }

    public int removeItem (long id){
        int count = db.delete(DatabaseHelper.Table_Name, DatabaseHelper.Key_ID+ "="+ id, null);

        //na.notifyDataSetChanged();


        return count;
    }

    public int updateAmount(String name, String amount){
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.Key_Amount, amount);
        String whereArgs[] = {name};
        int count = db.update(DatabaseHelper.Table_Name, contentValues, DatabaseHelper.Key_Name + "=?", whereArgs);
        return count;
    }
    public  String searchData(String sname){
        String columns[] = {DatabaseHelper.Key_Name, DatabaseHelper.Key_Amount};
        String selectionArgs[] = {sname};
        Cursor cursor = db.query(DatabaseHelper.Table_Name, columns, DatabaseHelper.Key_Name + "=?", selectionArgs, null, null, null);
        StringBuffer buffer = new StringBuffer();
        while (cursor.moveToNext()){
            int index1 = cursor.getColumnIndex(DatabaseHelper.Key_Name);
            int index2 = cursor.getColumnIndex(DatabaseHelper.Key_Amount);
            String name = cursor.getString(index1);
            String amount = cursor.getString(index2);
            buffer.append(name + " " + amount + "\n");
        }
        return buffer.toString();
    }
//    This is for the Toast dispaly
    public String getAllData(){
        String columns[] = {DatabaseHelper.Key_ID, DatabaseHelper.Key_Name, DatabaseHelper.Key_Amount};
        Cursor cursor = db.query(DatabaseHelper.Table_Name, columns, null, null, null, null, null, null );
        StringBuffer buffer = new StringBuffer();
        while (cursor.moveToNext()){
            int index1 = cursor.getColumnIndex(DatabaseHelper.Key_ID);
            int rowid = cursor.getInt(index1);
            int index2 = cursor.getColumnIndex(DatabaseHelper.Key_Name);
            String name = cursor.getString(index2);
            int index3 = cursor.getColumnIndex(DatabaseHelper.Key_Amount);
            int amount = cursor.getInt(index3);
            buffer.append(rowid + " " + name + " " + amount + "\n");
        }
        return buffer.toString();
    }

    public List<Names> getAllNames(){
        String columns[] = {DatabaseHelper.Key_ID, DatabaseHelper.Key_Name, DatabaseHelper.Key_Amount, DatabaseHelper.Key_Date};
        Cursor cursor = db.query(DatabaseHelper.Table_Name, columns, null, null, null, null, DatabaseHelper.Key_ID+" DESC",null );
        while (cursor.moveToNext()){
            int index1 = cursor.getColumnIndex(DatabaseHelper.Key_ID);
            int rowid = cursor.getInt(index1);
            int index2 = cursor.getColumnIndex(DatabaseHelper.Key_Name);
            String name = cursor.getString(index2);
            int index3 = cursor.getColumnIndex(DatabaseHelper.Key_Amount);
            Double amount = cursor.getDouble(index3);
            int index4 = cursor.getColumnIndex(DatabaseHelper.Key_Date);
            String date = cursor.getString(index4);
            Names names = new Names(rowid, name, amount, date);
            namesList.add(names);
        }
        return namesList;
    }
    public long insertData (String name, Double amount, String date){

        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.Key_Name, name);
        contentValues.put(DatabaseHelper.Key_Amount, amount);
        contentValues.put(DatabaseHelper.Key_Date, date);
        long id = db.insert(DatabaseHelper.Table_Name, null ,contentValues);
        return id;

    }


    private static class DatabaseHelper extends SQLiteOpenHelper {
        private static final String Database_Name = "Demoze.db";
        private static final String Table_Name = "salary";
        private static final int Database_Version= 10;
        private static final String Key_ID = "_id";
        private static final String Key_Name = "name";
        private static final String Key_Amount = "amount";
        private static final String Key_Date = "date";
        private static final String Create_table = "create table "+Table_Name+
                " ("+Key_ID+" integer primary key autoincrement, "+Key_Name+
                " text, "+Key_Amount+ " real, "+Key_Date+" text)";
        private static final String Table_Drop = "drop table if exists "+Table_Name;
        private Context context;

        public DatabaseHelper(@Nullable Context context) {
            super(context, Database_Name, null, Database_Version);
            this.context = context;
            Toast.makeText(context, "Constructor Called", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(Create_table);
                Toast.makeText(context, "OnCreate Called", Toast.LENGTH_SHORT).show();
            } catch (SQLException e){
                Toast.makeText(context, ""+e, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            try {
                Toast.makeText(context, "OnUpgrade Called", Toast.LENGTH_SHORT).show();
                db.execSQL(Table_Drop);
                onCreate(db);
            } catch (SQLException e) {
                Toast.makeText(context, "" + e, Toast.LENGTH_SHORT).show();
            }
        }
    }

}

支出活动.Java

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication.ui.Names;
import com.example.myapplication.ui.NamesAdapter;

import java.util.ArrayList;
import java.util.List;

public class SpendingActivity extends AppCompatActivity {

    DatabaseAdapter databaseAdapter;
    EditText crud;
    RecyclerView rvPrograms;
    NamesAdapter namesAdapter;
    RecyclerView.LayoutManager layoutManager;
    List<Names> namesList = new ArrayList<>();


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

        databaseAdapter = new DatabaseAdapter(this);
        namesList = databaseAdapter.getAllNames();
        rvPrograms = findViewById(R.id.rvDBdata);
        rvPrograms.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        rvPrograms.setLayoutManager(layoutManager);
        namesAdapter = new NamesAdapter(this, namesList, rvPrograms);
        rvPrograms.setAdapter(namesAdapter);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

                databaseAdapter.removeItem((long) viewHolder.itemView.getTag());

            }
        }).attachToRecyclerView(rvPrograms);

        crud = findViewById(R.id.crudEditText);

        String data = databaseAdapter.getAllData();
        Toast.makeText(this, data, Toast.LENGTH_LONG).show();
    }

    public void Home (View view) {

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    public void Search (View view){
        String name = crud.getText().toString().trim();
        String result = databaseAdapter.searchData(name);
        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
    }


    public void Update (View view) {
        String amount = crud.getText().toString().trim();
        databaseAdapter.updateAmount("taxi", amount);
    }
    public void Delete (View view) {
        String name = crud.getText().toString().trim();
        databaseAdapter.deleteData(name);
    }

}

在您的NamesAdapter ,您可以公开一个名为 deleteItem 的方法:

public class NamesAdapter extends RecyclerView.Adapter<NamesAdapter.ViewHolder> {
     ...

    public void deleteItem(int position){
       namesList.remove(position);
       notifyItemRemoved(position);
    }
}

onSwiped()方法内部,您需要调用 NameAdapter 的 deleteItem 方法:

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
      int position = viewHolder.getAdapterPosition();
      namesAdapter.deleteItem(position);
      databaseAdapter.removeItem((long) viewHolder.itemView.getTag());
}

回收视图适配器类

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private List<String> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    MyRecyclerViewAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_row, parent, false);
        return new ViewHolder(view);
    }

    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String animal = mData.get(position);
        holder.myTextView.setText(animal);
    }

    // total number of rows
    @Override
    public int getItemCount() {
        return mData.size();
    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.tvAnimalName);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    // convenience method for getting data at click position
    String getItem(int id) {
        return mData.get(id);
    }

    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

主要活动

  public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {

    MyRecyclerViewAdapter adapter;
ArrayList<String> animalNames

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

        // data to populate the RecyclerView with
        animalNames = new ArrayList<>();
        animalNames.add("Horse");
        animalNames.add("Cow");
        animalNames.add("Camel");
        animalNames.add("Sheep");
        animalNames.add("Goat");

        // set up the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.rvAnimals);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MyRecyclerViewAdapter(this, animalNames);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
   animalNames.remove(position);
   adapter.notifyItemRemoved(position);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM