0

私は長い間これに固執しており、本当にイライラしています。基本的に、アプリは、その、およびListViewを含むものから始まります。Movie TitlesGrossYear

ユーザーは、メニューから別のアクティビティを使用して、新しい映画、グロス、および年を追加できます。その後、値は最初のアクティビティに戻され、リストの一番下に配置されます。

これが私の問題の始まりです。私が抱えていた最初の問題は、新しいアイテムを表示しようとしているときにアプリが強制終了することです。今、それはまったく表示したくありません。コードは次のとおりです。

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

FlagBoolean変数は基本的に、ユーザーがムービーを追加したかどうかを示します。ユーザーがムービーを追加すると、else ステートメントに入り、そこから更新されます。私はこのif-else声明をどこに置くべきか本当に混乱しています。

GetSearchResultの関数を使っていくつかの実験を行ったSampleCustomAdapterところ、 の出力に直接影響することがわかりましたListView。私はステートメントをそこに置いてみif-elseましたが、たくさんのアイテムがListView.

Usingadapter.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 日前から私を苛立たせていました。助けていただければ幸いです。ありがとう。

4

2 に答える 2

2

アダプターで変更されたデータセットを通知するだけです

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

リストビューは自動的に更新されます

更新 すると、いつでも次を使用できますが、動作しますが、アダプターに通知することをお勧めします。

movieList.add(newMovie);
adapter = new SampleCustomAdapter(movieList);
setListAdapter(adapter);
于 2012-08-21T13:27:20.637 に答える
0

adapter.notifyDataSetChanged()を使用する必要があります。このリンクを確認してください

于 2012-08-21T13:37:16.923 に答える