[英]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 行,在第二张图片中删除了一些行,第三张显示了我想要的输出,减去绘画写作:
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:请按照以下步骤操作,希望对您有所帮助:
get your itemList
from TestAdapter
.让你的
itemList
从TestAdapter
。
you can change any raw you want.你可以改变任何你想要的原料。 (For example change data of item in raw 6)
(例如更改原始 6 中项目的数据)
send it back to the testAdapter
.将其发送回
testAdapter
。
call method notifyDataSetChanged();
调用方法
notifyDataSetChanged();
. .
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.