2012-08-21 3 views
0

나는 오래 동안 이걸로 붙어 있었고, 정말 실망 스럽다. 기본적으로 앱은 Movie Titles, GrossYear을 포함하는 ListView으로 시작합니다.안드로이드 - 목록보기 업데이트

사용자는 메뉴에서 다른 활동을 사용하여 새 영화, 총 및 연을 추가 할 수 있습니다. 값은 첫 x ​​째 활동으로 다시 리턴되고 목록의 맨 아래에 놓입니다.

여기가 내 문제가 시작되는 곳입니다. 내가 가진 첫 번째 문제는 앱이 새로운 항목을 표시하려고 할 때 강제 종료한다는 것입니다. 이제는 전혀 표시하고 싶지 않습니다. 코드는 다음과 같습니다.

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

+0

업데이트 된 답변 확인 –

+0

나는 본다. 나는 또한 질문을 업데이트했고 나는 두 번째 코드 블록에 추가해야한다고 생각한다. 어떤 일이 발생하는지는 단 하나의 영화 만 표시된다는 것입니다. – Razgriz

0

당신은 adapter.notifyDataSetChanged()를 사용해야합니다. 확인 This Link

+0

'adapter.notifyDataSetChanged(); '를 사용하여 배치 한 행에서 NullPointerException을 받았습니다. . listview의 데이터는 strings.xml에서 가져 와서 수동으로 입력하지 않습니다. – Razgriz