如何在将新项目添加到列表后刷新列表视图?

时间:2014-03-23 18:47:06

标签: android

我知道这个问题之前已被问了几次,我尝试了那里的所有建议,在我向列表中添加新项目后仍然无法刷新列表视图 任何人都可以试着解释我该怎么办? thnaks

这是添加的代码:

公共类MainActivity扩展了ListActivity {

private DBHandler dataBase;
private ArrayList<Movies> list;
private ArrayAdapter<Movies> adapter;
private ListView lv;
private ImageButton addMovie;
private Intent intent;
final static int FLAG_FOR_ADDING=1;
final static int FLAG_FOR_EDITING=2;
final static int FLAG_FROM_MENU=3;
private int selected_movie;
private String the_movie;
private String movie_title;
private String movie_description;
private String movie_url;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);



    dataBase = new DBHandler(MainActivity.this);
    // by pressing this button the user will get instructions about how to use this application
    Button start = (Button)findViewById(R.id.how_to_start);
    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

        Toast.makeText(MainActivity.this, "Press the plus button for adding a movie or the menu button for the menu", Toast.LENGTH_LONG).show();

        }
    });
    // by pressing this button, the menu of this application will open
    ImageButton menu = (ImageButton)findViewById(R.id.menu_context);
    menu.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            openOptionsMenu();

        }
    });

    addMovie = (ImageButton)findViewById(R.id.add_movie);
    addMovie.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            registerForContextMenu(addMovie);
            openContextMenu(addMovie);

        }
    });
    // the array list is getting the movies from the database
    list = dataBase.getAllMovies();
    // here i am setting the adapter that will handle the list
    adapter = new ArrayAdapter<Movies>(MainActivity.this, R.layout.row,list);
    // i am getting a default xml
    lv=getListView();
    // i am connecting between the list and the adapter
    lv.setAdapter(adapter);

    // by short pressing an item on the list the user will move to the edit_a_movie page 
    // in order to edit the movie
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            intent = new Intent(MainActivity.this,Edit_A_Movie.class);
            // i am sending the information of the item that been pressed to the edit_a_movie page
            // the id, title,description and the url_photo
            intent.putExtra("item_id", list.get(position).getId());
            intent.putExtra("item_title", list.get(position).getTitle().toString());
            intent.putExtra("item_description", list.get(position).getDescription().toString());
            intent.putExtra("item_url", list.get(position).getPhoto_url().toString());

            startActivityForResult(intent, FLAG_FOR_EDITING);



        }
    });

    // a long press on a movie in the list will open a context menu for deleting or editing the item

    lv.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                int position, long id) {
            // i am getting the information of the movie that was pressed
            selected_movie = list.get(position).getId();
            the_movie = String.valueOf(selected_movie);
            movie_title = list.get(position).getTitle().toString();
            movie_description = list.get(position).getDescription().toString();
            movie_url = list.get(position).getPhoto_url().toString();
            // i register to a context menu 
            registerForContextMenu(lv);
            openContextMenu(lv);


            return true;
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()){

    // by pressing the exit option, the user will exit the application
    case R.id.menu_exit:
    finish();
    android.os.Process.killProcess(android.os.Process.myPid());
    super.onDestroy();


        break;
    // this option will delete all the movies from the list 
    case R.id.menu_delete:
        dataBase.deleteAllMovies();
        break;

        default:
            break;

    }



    return super.onOptionsItemSelected(item);   
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    // if the user will press the menu button he will get the menu and if he will press 
    // the plus button he will get 2 options: 1. move to the edit a movie page
    // 2. move to the search a movie from the Internet page
    // if the user will press a long press on a movie he will get 2 options:
    //1. update the movie
    //2. delete the movie
    if(v.getId() == R.id.menu_context){
        getMenuInflater().inflate(R.menu.main, menu);
    }
    else if (v.getId() == R.id.add_movie){
        getMenuInflater().inflate(R.menu.aad_menu, menu);
    } 
    else {
        getMenuInflater().inflate(R.menu.edit_or_delete, menu);
    }

    }


@Override
public boolean onContextItemSelected(MenuItem item) {

    switch(item.getItemId()){

    // selecting this option will exit the application
    case R.id.menu_exit:
    finish();
    android.os.Process.killProcess(android.os.Process.myPid());
    super.onDestroy();

        break;

    // this option will delete all the movies from the list 
    case R.id.menu_delete:
        dataBase.deleteAllMovies();
        break;
    // this option will move the user to the edit a movie page  
    case R.id.move_to_edit:

         intent = new Intent(MainActivity.this,Edit_A_Movie.class);
        startActivityForResult(intent, FLAG_FOR_ADDING);

        break;
    // this option will get the user move to the add a movie from the Internet page 
    case R.id.move_to_search:

        break;
        // if the user will press on a movie he will be able to update the movie or delete it
        //this option will delete the movie
    case R.id.delete_menu_movie:
        dataBase.deleteMovie(the_movie);
    break;

    // this option will move the user to the edit_a_movie page
    case R.id.edit_menu_movie:
        intent = new Intent(MainActivity.this,Edit_A_Movie.class);
        // i am sending the information of the pressed movie 
        intent.putExtra("item_id",selected_movie);
        intent.putExtra("item_title", movie_title);
        intent.putExtra("item_description", movie_description);
        intent.putExtra("item_url", movie_url);
        startActivityForResult(intent, FLAG_FROM_MENU);
        break;
        default:
            break;
    }

    return super.onContextItemSelected(item);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    // this is the info i am getting from the edit_a_movie page in order to put it in the database
    // i am using it to add a new movie to the list
    if(requestCode==FLAG_FOR_ADDING && resultCode==RESULT_OK){
        // this is the info i received
        String title_from_adding = data.getStringExtra("user_title");
        String description_from_adding = data.getStringExtra("user_desciption");
        String url_from_adding = data.getStringExtra("user_url");

        // here i am putting the info in the database
        dataBase.addMovie(title_from_adding, description_from_adding, url_from_adding);


    // in case that the user pressed the cancel button he will get a massage    
    } else if
    (requestCode==FLAG_FOR_ADDING && resultCode==RESULT_CANCELED){
        Toast.makeText(MainActivity.this, "No movie has been added", Toast.LENGTH_LONG).show();
    }   
    // i am using the info from the edit_a_movie page in order to update a movie    
     else if
    (requestCode==FLAG_FOR_EDITING && resultCode==RESULT_OK ){
        String position_from_editing = data.getStringExtra("position");
        String title_from_editing = data.getStringExtra("user_title");
        String description_from_editing = data.getStringExtra("user_desciption");
        String url_from_editing = data.getStringExtra("user_url");
        // the database is being updating
        dataBase.updateMovie(position_from_editing, title_from_editing, description_from_editing, url_from_editing);
    }
    // this case is for editing the movie that was long pressed
     else if
     (requestCode==FLAG_FROM_MENU && resultCode==RESULT_OK){
         // i am receiving the updated information from the edit_a_movie page
         String position_from_menu = data.getStringExtra("position");
         String title_from_menu = data.getStringExtra("user_title");
         String description_from_menu = data.getStringExtra("user_desciption");
         String url_from_menu = data.getStringExtra("user_url");
         //the database is being updating with the new information
         dataBase.updateMovie(position_from_menu, title_from_menu, description_from_menu, url_from_menu);
     }



}

}

1 个答案:

答案 0 :(得分:1)

您应该在适配器上调用notifyDataSetChanged

dataBase.addMovie(..)之后

adapter.notifyDataSetChanged();