【问题标题】:I want to change the application state and then reload the activity to reflect the change我想更改应用程序状态,然后重新加载活动以反映更改
【发布时间】:2012-06-06 20:18:29
【问题描述】:

嗨,我更改了应用程序状态,然后我想重新加载活动以反映我尝试使用 notifyDataSetChanged 的​​更改,但它也不工作......基本上当我选择“删除”选项时,删除操作有效,但是它不刷新光标适配器 ListActivity 上的 ContextMenu:

    public boolean onContextItemSelected(MenuItem item)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    int index = info.position;
    View view = info.targetView;
    long id = info.id;

    if(item.getItemId()==R.id.edit){
        Intent i=new Intent(ProjetoProTelefoneActivity.this, DetailForm.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
        return(true);
    }
    else if(item.getItemId()==R.id.remove){

        Intent i=new Intent(ProjetoProTelefoneActivity.this, DeleteItemList.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
        ListView listView = getListView();
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        return(true);
    }

    return super.onContextItemSelected(item);
}

我的 initLIst():

    private void initList(){
    if(modelo!=null){
        stopManagingCursor(modelo);
        modelo.close();
    }

    modelo =helper.getAll(prefs.getString("sort_order","nome DESC"));
    startManagingCursor(modelo);        

    adapter = new RestaurantAdapter(modelo);       
    setListAdapter(adapter);         

}

DeleteItemList:

public class DeleteItemList extends Activity{
RestauranteHelper helper = null;
String restauranteId= null;


public void onCreate(Bundle savedInstaceState){
    super.onCreate(savedInstaceState);
    helper= new RestauranteHelper(this);


    restauranteId=getIntent().getStringExtra(ProjetoProTelefoneActivity.ID_EXTRA);
    helper.delete(restauranteId);
    finish();
}

public void onDestroy(){
    super.onDestroy();
    helper.close();

}
}

我的 RestauranteHelper.delete:

    public void delete(String id){
    String[] args = {id};

    getWritableDatabase().delete("restaurantes", "_ID =?", args);

}

类餐厅适配器:

class RestaurantAdapter extends CursorAdapter {
    RestaurantAdapter(Cursor c) {
      super(ProjetoProTelefoneActivity.this, c);
    }

    public void bindView(View row, Context ctxt,
                         Cursor c) {
      RestaurantHolder holder=(RestaurantHolder)row.getTag();

      holder.populateFrom(c, helper);
    }


    public View newView(Context ctxt, Cursor c,
                         ViewGroup parent) {
      LayoutInflater inflater=getLayoutInflater();
      View row=inflater.inflate(R.layout.row, parent, false);
      RestaurantHolder holder=new RestaurantHolder(row);

      row.setTag(holder);

      return(row);
    }
  }

我有其他话题,但我在那里尝试做的所有事情都没有奏效...... idk 做什么,删除操作有效,但不要刷新光标适配器

在我纠正 onContextItemSelected 的代码后,我不再使用 DeleteItemList,如您所见:

    public boolean onContextItemSelected(MenuItem item)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    int index = info.position;
    View view = info.targetView;
    long id = info.id;

    if(item.getItemId()==R.id.edit){
        Intent i=new Intent(ProjetoProTelefoneActivity.this, DetailForm.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
        return(true);
    }
    else if(item.getItemId()==R.id.remove){
        restauranteId=String.valueOf(id);
        //Toast.makeText(this,  String.valueOf(id),  Toast.LENGTH_LONG).show();
        helper.delete(restauranteId);
        initList();
        return(true);
    }
    return super.onContextItemSelected(item);
}

谢谢大家!!

【问题讨论】:

    标签: android android-listview android-activity simplecursoradapter contextmenu


    【解决方案1】:
    1. 您不需要DeleteItemList 活动。活动是用户可以做的单一的、专注的事情(即 UI 屏幕)。为简单的删除创建Activity 完全没有意义。您应该按原样(在当前活动中)执行删除,而不是创建(并完成)一个全新的 Activity 来执行任务。

    2. 快速修复是在光标上调用reQuery。在 API 版本 11 之前,刷新Cursors 内容的方式是在其上调用requery()(例如,在执行删除之后)。但是请注意,不赞成这样做,而赞成让您的 Activity 实现 LoaderManager.LoaderCallbacks<Cursor> 接口。 startManagingCursor()stopManagingCursor() 也已弃用。

    3. 正确的解决方法是重新开始并让您的Activity 实现LoaderManager.LoaderCallbacks<Cursor> 接口。如果您这样做,您的代码会变得多么简单,这几乎是荒谬的,因为您在帖子中提到的所有内容都是由 LoaderManager 自动完成的。 LoaderManager 注册了一个ContentObserver,它将检测您的数据何时更改。它还自动在后台线程上执行查询,这是首选,因为它可以确保昂贵的查询不会阻塞 UI 线程。

      话虽如此,这需要你做很多工作,所以如果你坚持快速修复并忽略#3,我不会责怪你:)。如果您有兴趣,这里有一个有用的tutorial

    【讨论】:

    • 这对我来说很难理解这里的一切,我自己学习了 3 天的 androids 应用程序,所以我会检查这个教程,看看会发生什么,谢谢
    • 我能给你的最好的建议是坚持下去,如果现在接受的太多了,就不管它。我记得当我刚开始的时候,很多东西真的让人不知所措,所以你并不孤单。但现在我回顾很多这些东西,它们都联系在一起。所以坚持下去! :)
    • 谢谢你的帮助,我决定不使用你建议的 deleteItemList,我修改了代码,你可以在我的编辑中看到 =D
    【解决方案2】:

    我认为问题发生在 onContextItemSelected() 代码内部:

    else if(item.getItemId()==R.id.remove){
        Intent i=new Intent(ProjetoProTelefoneActivity.this, DeleteItemList.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
    
        // The following is executed before the DeleteItemList does 
        // its deletion work!
    
        ListView listView = getListView();
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    
        return(true);
    }
    

    因此,只需启动活动以获得结果:

    else if(item.getItemId()==R.id.remove){
        Intent i=new Intent(ProjetoProTelefoneActivity.this, DeleteItemList.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivityForResult(i, YOUR_REQUEST_CODE); // check the documentation
        return(true);
    }
    

    然后您就可以使用 onActivityResult() 从 DeleteItemList 获取返回:

    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        if (YOUR_REQUEST_CODE == requestCode) {
            // you are back from DeleteItemList, so refresh the list content
            ((CursorAdapter) getListAdapter()).notifyDataSetChanged(); // or smth like that
        }
    }
    

    【讨论】:

    • 顺便说一句,看看DeleteItemList 做了什么我应该说你不需要它,因为你可以在主要活动中执行相同的删除操作。
    • 你对 YOUR_REQUEST_CODE 的意思是什么,我理解这些更改是做什么的,但我不知道我应该在 YOUR_REQUEST_CODE 中添加什么..."/
    • 请查看Activity.startActivityForResult(Intent intent, int requestCode)的文档。
    • 谢谢帮助,我决定不使用你所说的 deleteItemList,我修改了代码,正如你在我的编辑中看到的那样 =D
    【解决方案3】:

    您可以在删除后重新查询,然后使用适配器设置该光标,可能有更好的方法,但这种方法有效并且可以快速修复

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2011-04-19
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多