2012-08-21 201 views
0

我一直堅持這個很長一段時間,這真的令人沮喪。基本上,應用程序以ListView開頭,其中包含Movie Titles,它們的GrossYearAndroid - 更新列表視圖

然後,用戶可以使用與菜單中的不同活動添加新電影,總值和年份。這些值然後返回到第一個活動並放置在列表的底部。

這是我的問題開始的地方。我遇到的第一個問題是應用程序Force在即將顯示新項目時關閉。現在,它根本不想顯示。下面的代碼:

public class Lab7_084106 extends ListActivity { 

private SampleCustomAdapter adapter; 
private ArrayList<MyMovies> movieList; 

public static boolean Flag = false; 

@SuppressWarnings("null") 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    //create stuff 
    super.onCreate(savedInstanceState); 
    movieList = new ArrayList<MyMovies>(); 



    Intent data = getIntent(); 
    //Flag = data.getStringExtra("Flag"); 

    String[] oldMovieList = getResources().getStringArray(R.array.movieArray); 
    String[] oldGrossList = getResources().getStringArray(R.array.worldwideGross); 
    String[] oldYearList = getResources().getStringArray(R.array.yearArray); 


    //if there's no new movie to display 
    if(!Flag){     

     for (int i = 0; i < oldMovieList.length; i++) { 
      MyMovies newMovie = new MyMovies(); 
      newMovie.setMovie(oldMovieList[i] + "NEW"); 
      newMovie.setGross(oldGrossList[i]); 
      newMovie.setYear(oldYearList[i]); 
      movieList.add(newMovie); 
     } 

     //adapter = new SampleCustomAdapter(movieList); 

     //setContentView(R.layout.row); 
     //setListAdapter(adapter); 
    } 
    else{ 

     Toast.makeText(getApplicationContext(), "Else Entered", Toast.LENGTH_SHORT).show(); 

     int newLength = 50; //oldMovieList.length + 1; 

     //create new array to store the new value 

     String[] newMovieArray = new String[newLength]; 
     String[] newGrossArray = new String[newLength]; 
     String[] newYearArray = new String[newLength]; 

     //populate the new list with the old one plus the new one 
     for (int i = 0; i < newLength; i++) { 

      if(i != newLength - 1){ 
       newMovieArray[i] = oldMovieList[i]; 
       newGrossArray[i] = oldGrossList[i]; 
       newYearArray[i] = oldYearList[i];  
      } 
      else{ 
       newMovieArray[i] = data.getStringExtra("Title"); 
       newGrossArray[i] = data.getStringExtra("Gross"); 
       newYearArray[i] = data.getStringExtra("Year"); 
      } 

     } 

     //populate the old one using the new list 
     for (int i = 0; i < newLength; i++) { 

      oldMovieList[i] = newMovieArray[i]; 
      oldGrossList[i] = newGrossArray[i]; 
      oldYearList[i] = newYearArray[i]; 

     } 

     //display stuff 
     for (int i = 0; i < newLength; i++) { 

       MyMovies newMovie = new MyMovies(); 
       newMovie.setMovie(oldMovieList[i]); 
       newMovie.setGross(oldGrossList[i]); 
       newMovie.setYear(oldYearList[i]); 
       movieList.add(newMovie); 

     } 

     //adapter = new SampleCustomAdapter(movieList); 
     //setListAdapter(adapter); 

    } 

    adapter = new SampleCustomAdapter(movieList); 
    setListAdapter(adapter); 


    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    //set stuff such that Page2 sends back a result to page 1 
    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      TextView t = (TextView) view.findViewById(R.id.title); 
      String name = (String) t.getText(); 
      Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show(); 

     } 
    }); 
} 


private class SampleCustomAdapter extends BaseAdapter { 

    private ArrayList<MyMovies> internalList; 

    String[] oldMovieList = getResources().getStringArray(R.array.movieArray); 
    String[] oldGrossList = getResources().getStringArray(R.array.worldwideGross); 
    String[] oldYearList = getResources().getStringArray(R.array.yearArray); 


    private ArrayList<MyMovies> GetSearchResults(){ 
     ArrayList<MyMovies> results = new ArrayList<MyMovies>(); 
     // make sure the arrays have the same length 
     for (int i = 0; i < oldMovieList.length; i++) { 
      MyMovies sr = new MyMovies(); 
      sr.setMovie(oldMovieList[i]); 
      sr.setGross(oldGrossList[i]); 
      sr.setYear(oldYearList[i]); 
      results.add(sr); 

     } 
     return results; 

    } 

    public SampleCustomAdapter(ArrayList<MyMovies> contacts){ 
     internalList = contacts; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return internalList.size(); 
    } 

    @Override 
    public Object getItem(int index) { 
     // TODO Auto-generated method stub 
     return internalList.get(index); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // NOTE: you can only do this if you have access to the Activity object 
     //  which is why this is an inner class 
     LayoutInflater inflater = getLayoutInflater(); 
     View view; 

     //System.out.println(parent.getClass().getName()); 
     //System.out.println(position); 


     if (convertView==null){ 
      view = inflater.inflate(R.layout.row, null); 
     } 
     else{ 
      view = convertView; 
     } 

     // extract the views to be populated 
     TextView movie = (TextView) view.findViewById(R.id.title); 
     TextView gross = (TextView) view.findViewById(R.id.gross); 
     TextView date = (TextView) view.findViewById(R.id.date); 

     // extract the object that will fill these 

     MyMovies movies = GetSearchResults().get(position); 
     //MyMovies movies = internalList.get(position); 


     movie.setText(movies.getMovie()); 
     gross.setText(movies.getGross()); 
     date.setText(movies.getYear()); 


     // return the view 
     return view; 
    } 
} 


//menu lawl 
@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menupage1, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    //Handle item selection using item.getItemId() 
    switch(item.getItemId()){ 
    case R.id.addMovie: 
     AddMovie(); 
     break; 
    } 


    return true; 
} 
//end menu stuff lol 

public void AddMovie(){ 
    Intent intent2 = new Intent(this, com.Android.Lab7.addMovie.class); 

    startActivity(intent2); 
    finish(); 
} 
} 

如果用戶增加了電影的標誌Boolean變量主要是告訴。如果用戶添加了電影,它將進入else語句並從那裏更新。我真的很困惑在哪裏把這個if-else聲明。

我跑GetSearchResult函數SampleCustomAdapter的一些實驗,發現它直接影響ListView的輸出。我試着把if-else陳述放在那裏,但是我最終在ListView中得到了很多物品。

使用adapter.notifyDataSetChanged();會給出NullPointerException錯誤並指向我放置它的位置。所以即使這樣做:

MyMovies newMovie = new MyMovies(); 
newMovie.setMovie(data.getStringExtra("Title")); 
newMovie.setGross(data.getStringExtra("Gross")); 
newMovie.setYear(data.getStringExtra("Year")); 
movieList.add(newMovie); 
adapter.notifyDataSetChanged(); 

作爲else塊,它不起作用。我認爲這與我從string.xml資源文件夾獲取初始值而不是通過硬編碼或用戶輸入有關。

這個問題一直讓我感到沮喪,因爲2-3天前,幫助真的很感激。謝謝。

回答

2

你只需要通知改變了你的適配器上的數據集

movieList.add(newMovie); 
adapter.notifyDataSetChanged(); 

列表視圖將自動更新

UPDATE 你總是可以使用下面的它會工作,但我更喜歡通知適配器。

movieList.add(newMovie); 
adapter = new SampleCustomAdapter(movieList); 
setListAdapter(adapter); 
+0

我曾嘗試過。但是,我會得到一個空指針或索引超出界限的錯誤。 – Razgriz 2012-08-21 13:35:09

+0

檢查已更新的答案 – 2012-08-21 13:47:47

+0

我明白了。我也更新了這個問題,我想我應該把它添加到我放置的第二塊代碼中?會發生什麼是隻顯示一部電影。 – Razgriz 2012-08-21 14:03:46

0

你應該使用adapter.notifyDataSetChanged()。檢查This Link

+0

使用'adapter.notifyDataSetChanged();'給了我一個NullPointerException 。列表視圖的數據取自strings.xml而不是手動輸入。 – Razgriz 2012-08-21 13:43:13