简体   繁体   English

Android studio:从数据库中删除项目时,如何更新回收站视图中的文本视图?

[英]Android studio: How do I update a textview in a recyclerview when an item from the database is deleted?

So I've made a demo app to demonstrate my problem and have some pictures for my expected outcome.所以我制作了一个演示应用程序来演示我的问题,并为我的预期结果提供了一些图片。 I'm using Room to create a database and a user is able to add an entry by pressing a button.我正在使用Room创建一个数据库,用户可以通过按一个按钮来添加一个条目。 There are only two fields: the id (primary key) and the row number.只有两个字段:id(主键)和行号。 I set the row number by getting the number of entries through a query and adding one to that value.我通过查询获取条目数并将其添加到该值来设置行号。 I then insert a new entry with the constructor requiring a row number.然后我插入一个带有需要行号的构造函数的新条目。

I've added an option to where a user can swipe right to delete an entry, but I can't figure out how to update the row number and to change the row number displayed in the textview to be the proper row number.我添加了一个选项,用户可以向右滑动以删除条目,但我不知道如何更新行号并将 textview 中显示的行号更改为正确的行号。 Here are some screenshots which might make what I'm asking easier to understand as I'm still pretty new.这里有一些屏幕截图,它们可能使我的要求更容易理解,因为我还是个新手。

I added 10 rows in the first picture, removed some rows in the second, and the third shows what I want the output to be, minus the paint writing:我在第一张图片中添加了 10 行,在第二张图片中删除了一些行,第三张显示了我想要的输出,减去绘画写作:

添加了 10 行

在此处输入图片说明

在此处输入图片说明

Here is the code:这是代码:

MainActivity.Java主Activity.Java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private TestViewModel testViewModel;

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



        Button addButton = findViewById(R.id.test_button);
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        final TestAdapter adapter = new TestAdapter();
        recyclerView.setAdapter(adapter);

        testViewModel = ViewModelProviders.of(this).get(TestViewModel.class);
        testViewModel.getAllTests().observe(this, new Observer<List<Test>>() {
            @Override
            public void onChanged(List<Test> tests) {
                adapter.submitList(tests);
            }
        });

        testViewModel.getNumberOfEntries().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {

            }
        });

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                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) {
                testViewModel.delete(adapter.getTestAt(viewHolder.getAdapterPosition()));
            }
        }).attachToRecyclerView(recyclerView);

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (testViewModel.getNumberOfEntries().getValue() != null) {
                    int rowNum = testViewModel.getNumberOfEntries().getValue() + 1;
                    testViewModel.insert(new Test(rowNum));
                }else{
                    int rowNum = 1;
                    testViewModel.insert(new Test(rowNum));
                }
            }
        });
    }


}


Test.Java测试.Java


import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "test_table")
public class Test {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private int rowNumber;

    public Test(int rowNumber){
        this.rowNumber = rowNumber;
    }

    public int getId() {
        return id;
    }

    public int getRowNumber() {
        return rowNumber;
    }

    public void setId(int id) {
        this.id = id;
    }
}

TestAdapter.Java测试适配器

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

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

import java.util.List;

public class TestAdapter extends ListAdapter <Test, TestAdapter.TestHolder> {

    protected TestAdapter() { super(DIFF_CALLBACK); }

    private static final DiffUtil.ItemCallback<Test> DIFF_CALLBACK = new DiffUtil.ItemCallback<Test>() {
        @Override
        public boolean areItemsTheSame(@NonNull Test oldItem, @NonNull Test newItem) {
            return newItem.getId() == oldItem.getId();
        }

        @Override
        public boolean areContentsTheSame(@NonNull Test oldItem, @NonNull Test newItem) {
            return newItem.getRowNumber() == oldItem.getRowNumber();
        }
    };

    @NonNull
    @Override
    public TestHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.test_item, parent, false);
        return new TestHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull TestAdapter.TestHolder holder, int position) {
        Test currentTest = getItem(position);

        holder.textViewRowNumber.setText(String.valueOf(currentTest.getRowNumber()));
    }

    public Test getTestAt(int position){ return  getItem(position);}

    class TestHolder extends RecyclerView.ViewHolder{
        private TextView textViewRowNumber;

        public TestHolder(View itemView){
            super(itemView);
            textViewRowNumber = itemView.findViewById(R.id.test_text_view);
        }
    }
}

TestDao.Java测试道Java

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

@Dao
public interface TestDao {

    @Insert
    void insert(Test test);

    @Delete
    void delete(Test test);

    @Query("SELECT * FROM test_table")
    LiveData<List<Test>> getAllEntries();

    @Query("SELECT Count(*) FROM test_table")
    LiveData<Integer>getNumberOfEntries();
}

TestDatabase.Java测试数据库

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

@Database(entities = Test.class, version = 1)

public abstract class TestDatabase extends RoomDatabase {

    private static TestDatabase instance;

    public abstract TestDao testDao();

    public static synchronized TestDatabase getInstance(Context context){
        if(instance == null){
            instance = Room.databaseBuilder(context.getApplicationContext(),
                    TestDatabase.class, "test_database")
                    .fallbackToDestructiveMigration()
                    .build();
        }
        return instance;
    }
}

TestRepository.Java测试库.Java

import android.app.Application;
import android.os.AsyncTask;

import androidx.lifecycle.LiveData;

import java.util.List;

public class TestRepository {
    private TestDao testDao;
    private LiveData<List<Test>> allTests;
    private LiveData<Integer> numberOfEntries;

    public TestRepository(Application application) {
        TestDatabase database = TestDatabase.getInstance(application);
        testDao = database.testDao();
        allTests = testDao.getAllEntries();
        numberOfEntries = testDao.getNumberOfEntries();
    }

    public void insert(Test test) {
        new InsertTestAsyncTask(testDao).execute(test);
    }

    public void delete(Test test) {
        new DeleteTestAsyncTask(testDao).execute(test);
    }

    public LiveData<Integer> getNumberOfEntries() {
        return numberOfEntries;
    }

    public LiveData<List<Test>> getAllTests() {
        return allTests;
    }

    private static class InsertTestAsyncTask extends AsyncTask<Test, Void, Void> {
        private TestDao testDao;

        private InsertTestAsyncTask(TestDao testDao) {
            this.testDao = testDao;
        }

        @Override
        protected Void doInBackground(Test... tests) {
            testDao.insert(tests[0]);
            return null;
        }
    }

    private static class DeleteTestAsyncTask extends AsyncTask<Test, Void, Void> {
        private TestDao testDao;

        private DeleteTestAsyncTask(TestDao testDao) {
            this.testDao = testDao;
        }

        @Override
        protected Void doInBackground(Test... tests) {
            testDao.delete(tests[0]);
            return null;
        }
    }

}

TestViewModel.Java测试视图模型.Java

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import java.util.List;

public class TestViewModel extends AndroidViewModel {
    private TestRepository repository;
    private LiveData<Integer> numberOfEntries;
    private LiveData<List<Test>> allTests;

    public TestViewModel(@NonNull Application application) {
        super(application);
        repository = new TestRepository(application);
        numberOfEntries = repository.getNumberOfEntries();
        allTests = repository.getAllTests();
    }

    public void insert(Test test) { repository.insert(test);}

    public void delete(Test test) { repository.delete(test);}

    public LiveData<Integer> getNumberOfEntries(){ return numberOfEntries; }

    public LiveData<List<Test>> getAllTests() { return allTests;}
}

Thanks!谢谢!

Follow these steps, I hope it will help:请按照以下步骤操作,希望对您有所帮助:

  1. get your itemList from TestAdapter .让你的itemListTestAdapter

  2. you can change any raw you want.你可以改变任何你想要的原料。 (For example change data of item in raw 6) (例如更改原始 6 中项目的数据)

  3. send it back to the testAdapter .将其发送回testAdapter

  4. call method notifyDataSetChanged();调用方法notifyDataSetChanged(); . .

  5. if you only change one item at a time, it's better to call notifyItemChanged(position);如果一次只更改一项,最好调用notifyItemChanged(position); abecause it has a better performance than notifyDataSetChanged();因为它比notifyDataSetChanged();有更好的性能notifyDataSetChanged();

You have more other tools like notifyItemInserted(position); notifyItemRemoved(position);您还有更多其他工具,例如notifyItemInserted(position); notifyItemRemoved(position); notifyItemInserted(position); notifyItemRemoved(position); that might help you.这可能对你有帮助。

Try to modify your ItemTouchHelper implementation like below:尝试修改您的ItemTouchHelper实现,如下所示:

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
        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) {
        testViewModel.delete(adapter.getTestAt(viewHolder.getAdapterPosition()));

        //get current list from adapter
        List currentList = adapter.getCurrentList();

        //remove item from list 
        currentList.remove(viewHolder.getAdapterPosition());

        //submit the current list to refresh view
        adapter.submitList(currentList);
    }
}).attachToRecyclerView(recyclerView);

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

相关问题 如何在 android studio 中使用 recyclerview 显示我的数据库? - How do i display my database using recyclerview in android studio? Android:如何在RecyclerView中拖放项目时有效地更新SQLite数据库? - Android: How do I effectively update the SQLite database when dragging and dropping items in the RecyclerView? 从 RecyclerView 中删除时如何修复重复的项目? - How to fix duplication of item when deleted from RecyclerView? android:如何从扩展RecyclerView的类中更新徽章TextView - android: How to update badge TextView from a class that extends RecyclerView 删除项目时如何刷新recyclerView? - How to refresh recyclerView when item deleted? 我如何在 Android Studio 上的 RecyclerView 上 setOnClickListener - How do i setOnClickListener on RecyclerView on Android Studio 从数据库中删除项目时如何使用自定义适配器自动更新 ListView - How to automatically update ListView with custom adapter when item is deleted from database 在Android中选择了微调项时如何更新TextView? - How to update TextView when a Spinner item is selected in Android? 使用 Groupie RecyclerView 库和 Kotlin 删除项目时如何通知和更新列表 - How to notify and update list when item has been deleted using Groupie RecyclerView library and Kotlin 如何在 android 工作室中按类别对 recyclerview 项目进行分组 - How can I group recyclerview item by category in android studio
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM