0

こんにちは私はアプリの状態を変更し、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();

}
}

My RestauranteHelper.delete:

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

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

}

クラスrestauranteAdapter:

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);
}

全てに感謝!!

4

3 に答える 3

0

削除後に再クエリを実行し、そのカーソルをアダプターに設定することもできます。おそらくもっと良い方法がありますが、この方法は機能し、簡単に修正できます

于 2012-06-06T20:39:34.003 に答える
0

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
    }
}
于 2012-06-06T20:39:06.643 に答える