Android 删除后刷新ListView
我检查了很多堆栈溢出问题,但都没有帮助。 如何在使用onLongClickListener删除项目后刷新我的listView? 正如您将看到的,适配器.notifyDataSetChanged()和listView.invalidateViews()都不工作 这是用必要的方法来实现的Android 删除后刷新ListView,android,listview,android-listview,onlongclicklistener,Android,Listview,Android Listview,Onlongclicklistener,我检查了很多堆栈溢出问题,但都没有帮助。 如何在使用onLongClickListener删除项目后刷新我的listView? 正如您将看到的,适配器.notifyDataSetChanged()和listView.invalidateViews()都不工作 这是用必要的方法来实现的 public class MainActivity extends AppCompatActivity { public FloatingActionButton fabAddWord; public Toolba
public class MainActivity extends AppCompatActivity {
public FloatingActionButton fabAddWord;
public Toolbar toolbar;
public ListView listView;
private RjecnikCursorAdapter adapter;
private RjecnikDB dbRjecnik;
private SQLiteDatabase db;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
fabAddWord = (FloatingActionButton) findViewById(R.id.fabAddWord);
listView = (ListView) findViewById(R.id.listView);
dbRjecnik = new RjecnikDB(this);
db = dbRjecnik.getWritableDatabase();
String query = "SELECT * FROM " + RjecnikDB.TABLE;
cursor = db.rawQuery(query, null);
adapter = new RjecnikCursorAdapter(this, cursor);
listView.setAdapter(adapter);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
deleteOnLongClick(cursor.getString(cursor.getColumnIndex(RjecnikDB.COLUMN_RIJEC)));
adapter.notifyDataSetChanged();
listView.invalidateViews();
return true;
}
});
}
public void deleteOnLongClick(String rijec) {
SQLiteDatabase db = dbRjecnik.getWritableDatabase();
db.delete(RjecnikDB.TABLE, RjecnikDB.COLUMN_RIJEC + " = ?", new String[] {rijec} );
this.adapter.notifyDataSetChanged();
this.listView.invalidateViews();
db.close();
}
}您只需使用notifyDataSetChanged()来刷新listView数据,invalidateViews()只会重新绘制可见项,但这些项上的内容没有任何更改(例如更改字体) 请注意,建议在UI线程上运行notifyDataSetChanged() 编辑2:您可以使用BaseAdapter而不是下面的CursorAdapter
public class RjecnikCursorAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<String> rjecnikList;
public RjecnikCursorAdapter(Activity activity, List<String> rjecnikList) {
this.activity = activity;
this.rjecnikList = rjecnikList;
}
@Override
public int getCount() {
return rjecnikList.size();
}
@Override
public Object getItem(int location) {
return rjecnikList.get(location);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.item_word, null);
TextView tvSingleLineWord = (TextView) view.findViewById(R.id.tvSingleLineWord);
tvSingleLineWord.setText(String.valueOf(rjecnikList.get(position)));
return convertView;
}
}
公共类RjecnikursorAdapter扩展BaseAdapter{
私人活动;
私人充气机;
私人名单;
公共RjecnikCursorAdapter(活动活动,列表rjecnikList){
这个。活动=活动;
this.rjecnikList=rjecnikList;
}
@凌驾
public int getCount(){
返回rjecnikList.size();
}
@凌驾
公共对象getItem(int位置){
返回rjecnikList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(充气器==null)
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
if(convertView==null)
convertView=充气机。充气(R.layout.item_word,空);
TextView TVSingelleLineWord=(TextView)view.findViewById(R.id.TVSingelleLineWord);
tvsingelineword.setText(String.valueOf(rjecnikList.get(position));
返回视图;
}
}
在你的活动中:
public class MainActivity extends AppCompatActivity {
public FloatingActionButton fabAddWord;
public Toolbar toolbar;
public ListView listView;
public List<String> mylist;
private RjecnikCursorAdapter adapter;
private RjecnikDB dbRjecnik;
private SQLiteDatabase db;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
fabAddWord = (FloatingActionButton) findViewById(R.id.fabAddWord);
listView = (ListView) findViewById(R.id.listView);
dbRjecnik = new RjecnikDB(this);
db = dbRjecnik.getWritableDatabase();
String query = "SELECT * FROM " + RjecnikDB.TABLE;
cursor = db.rawQuery(query, null);
mylist = new ArrayList<>();
if (cursor.moveToFirst()){
do{
//change this with your column data
String data = cursor.getString(cursor.getColumnIndex("data");
mylist.add(data);
}while(cursor.moveToNext());
}
cursor.close();
adapter = new RjecnikCursorAdapter(this, mylist);
listView.setAdapter(adapter);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
deleteOnLongClick(cursor.getString(cursor.getColumnIndex(RjecnikDB.COLUMN_RIJEC)));
mylist.remove(position);
adapter.notifyDataSetChanged();
listView.invalidateViews();
return true;
}
});
}
public void deleteOnLongClick(String rijec) {
SQLiteDatabase db = dbRjecnik.getWritableDatabase();
db.delete(RjecnikDB.TABLE, RjecnikDB.COLUMN_RIJEC + " = ?", new String[] {rijec} );
this.adapter.notifyDataSetChanged();
this.listView.invalidateViews();
db.close();
}
public类MainActivity扩展了AppCompatActivity{
公共浮动操作按钮fabAddWord;
公共工具栏;
公共列表视图列表视图;
公开名单;
专用Rjecnikursoradapter适配器;
私人RjecnikDB dbRjecnik;
专用数据库数据库;
私有游标;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
fabAddWord=(FloatingActionButton)findViewById(R.id.fabAddWord);
listView=(listView)findViewById(R.id.listView);
dbRjecnik=新的RjecnikDB(本);
db=dbRjecnik.getWritableDatabase();
String query=“SELECT*FROM”+RjecnikDB.TABLE;
cursor=db.rawQuery(查询,空);
mylist=新的ArrayList();
if(cursor.moveToFirst()){
做{
//使用列数据更改此选项
字符串数据=cursor.getString(cursor.getColumnIndex(“数据”);
添加(数据);
}while(cursor.moveToNext());
}
cursor.close();
适配器=新的RjecnikCursorAdapter(此,mylist);
setAdapter(适配器);
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
deleteOnLongClick(cursor.getString(cursor.getColumnIndex(RjecnikDB.COLUMN_-RIJEC));
mylist.remove(位置);
adapter.notifyDataSetChanged();
listView.invalidateViews();
返回true;
}
});
}
public void deleteOnLongClick(字符串rijec){
SQLiteDatabase db=dbRjecnik.getWritableDatabase();
delete(RjecnikDB.TABLE,RjecnikDB.COLUMN_RIJEC+“=?”,新字符串[]{RIJEC});
this.adapter.notifyDataSetChanged();
this.listView.invalidateViews();
db.close();
}
适配器具有数据缓存,因此当数据库中的数据更改时,列表视图中的数据不会更改。您应该更改光标
@Override
public void changeCursor(Cursor cursor) {
mIndexer.setCursor(cursor);
super.changeCursor(cursor);
}
将下面的代码放到您的OnItemLongClickListener
cursor = db.rawQuery(query, null);
adapter.changeCurosr(cursor);
我相信您只是在从DB而不是从适配器中删除?当我转到另一个活动并返回时,删除的textView已不存在。那么,我应该如何从适配器中删除?仍然不工作。我添加了新线程(new Runnable(){@Override public void run()){MainActivity.this.runOnUiThread(new Runnable(){@Override public void run(){adapter.notifyDataSetChanged();}}}}});}}).start()
只有在我转到另一个活动并返回后,删除的textView才会被删除。1-请您通过添加适配器代码来编辑帖子?2-要在UI线程上运行代码,您不需要使用其他线程,只需runOnUiThradI没有listView的remove方法。只有少数真正尝试删除视图的方法,如removeView,removeViewAt,removeFooterView
等。所有这些都会导致错误,例如AdapterView中不支持removeViewAt(int)
是的,很抱歉我混淆了Listdb.rawQuery(query,null);
第一个参数查询应该是SELECT*FROM TABLE\u NAME
?是的,因此您可以设置String query=“SELECT*FROM”+RjecnikDB.TABLE;
到最终版
在大数据库的情况下,频繁的查询会影响速度吗?敲打确定性。我建议您不要使用这种方法。拆分数据库部分和UI部分,然后用异步的方法加载数据。顺便说一句,您应该从数据库异步加载数据。如果您有任何其他问题斯蒂昂,给我发封电子邮件。zhenghuiy@gmail.com
cursor = db.rawQuery(query, null);
adapter.changeCurosr(cursor);