Android 删除后刷新ListView

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

我检查了很多堆栈溢出问题,但都没有帮助。 如何在使用onLongClickListener删除项目后刷新我的listView? 正如您将看到的,适配器.notifyDataSetChanged()和listView.invalidateViews()都不工作

这是用必要的方法来实现的

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)
是的,很抱歉我混淆了List
db.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);