从光标适配器不工作的列表中删除最后一项

时间:2014-08-24 12:12:16

标签: android listview cursor android-cursoradapter

我正在开发一个android应用程序,它显示所有联系人sms消息(实际上是联系线程)listView中有一个游标适配器来获取Sms消息

这是我在适配器中使用的查询:

//threadId ==> id of thread which I need it's messages
Cursor cursor = getContentResolver().query(Uri.parse("content://sms/"),
    new String[] {"_id", "thread_id" ,"date" ,"body"},"thread_id = ?", new String[] { threadId }, "date ASC");

adapter = new myListAdapter(this, cursor);
ListView lv = (ListView) findViewById(R.id.lv_chathistory);
lv.setStackFromBottom(true);
lv.setAdapter(adapter);

这是我的适配器:

public class myListAdapter  extends CursorAdapter
{


    public myListAdapter(Context context, Cursor c) 
    {
        boolean autoRequery = true;
        super(context, c, autoRequery);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) 
    {

        String temp = cursor.getString(cursor.getColumnIndexOrThrow("body"));

        TextView txtMes;

        txtMes = (TextView) view.findViewById(R.id.tv_mess);

        txtMes.setText(temp);

    }



    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v= inflater.inflate(R.layout.chat_item, parent, false);
        bindView(v, context, cursor);
        return v;
    }
}

每件事情都运作良好,列表会显示正确的项目。 但是当我想删除一条消息时

如果消息是列表中的第一个中间项,它将被很好地删除并且列表将被更新(因为自动重新查询已打开)很好,但是如果我删除了最后一条消息(当线程中只有一条消息时以及何时在线程中有很多消息并试图删除最后一条消息将被删除但是我在调​​试后得到了CursorIndexOutOfBoundsException我发现问题是requery(当我禁用自动重新查询短信将被删除而没有刷新列表,当我致电adapter.getCursor().requery();我得到同样的例外。

这是我的删除代码:

try
{

    //itemsToDelete ==> a string array containing id of message to be removed(just one message)

    ///////making sure itemsToDelete is correct///////
    String s = "Delete Id: ";
    for (String ss : itemsToDelete )
    {
        s = s + ss+ ",";
    }
    Toast.makeText(getApplicationContext(), s , Toast.LENGTH_LONG).show();
    ///////////////////////////////



    int a = getContentResolver().delete(Uri.parse("content://sms" +"/"),"_id" + "=?",itemsToDelete);

    Toast.makeText(getApplicationContext(), ""+a, Toast.LENGTH_LONG).show();
}
catch(Exception ex)
{
    Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
    //I don't got any exceptions here , another CursorIndexOutOfBoundsException happens from some where else and cause force close
}

我该怎么办?

1 个答案:

答案 0 :(得分:0)

根据the docs,你不应该使用requery:

  

此方法在API级别11中已弃用。请勿使用此方法。只是   请求一个新的游标,这样你就可以异步并更新   新光标返回后的列表视图。

我会按照文档中的建议操作,只需要一个新的游标。完成此操作后,您可以通过swapCursor()

上的CursorAdapter将其与旧文件交换掉