Android的 - 更新列表视图 [英] Android - Updating a List View

查看:121
本文介绍了Android的 - 更新列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直坚持这样做很长时间,同时,这真的令人沮丧。基本上,应用程序开始与包含电影片名一个的ListView ,其年度

I've been stuck with this for a long while and it's really frustrating. Basically the app starts off with a ListView containing Movie Titles, their Gross, and Year.

然后用户可以使用从菜单中选择不同的活动添加一个新的电影,毛利率和年份。然后将这些值返回到第一个活动和被放置在列表的底部。

The user then can add a new movie, gross, and year using a different activity from the menu. The values are then returned back to the first activity and is placed at the bottom of the list.

这是我的问题开始的地方。我的第一个问题是,应用程序强制关闭时,它要显示新项目。现在,它不希望在所有显示量。这里的code:

This is where my problem begins. The first problem I had is that the app Force Closes when it's about to display the new item. Now, it doesn't want to display at all. Here's the Code:

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

布尔变量基本上告知用户,如果用户添加电影。如果用户增加了一个电影,它会从那里进入else语句和更新。我真的很困惑在哪里把这个的if-else 语句。

The Flag Boolean variable basically tells if the user added a movie. If the user added a movie, it will enter the else statement and update from there. I'm really confused where to put this if-else statement.

我跑了的 SampleCustomAdapter GetSearchResult 函数的几个实验,发现它直接影响的输出在的ListView 。我试着放置的if-else 语句有,但我结束了在的ListView 的项目很多。

I ran a few experiments with the GetSearchResult function of SampleCustomAdapter and found out that it directly affects the output of the ListView. I tried placing the if-else statement there but I ended up with a LOT of items in the ListView.

使用 adapter.notifyDataSetChanged(); 给出NullPointerException错误,并指出,我把它。所以,即使这样做:

Using adapter.notifyDataSetChanged(); gives a NullPointerException error and points to where I placed it. So even if do something like:

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

由于其他块,这是行不通的。我认为这是与我正在从string.xml资源文件夹而不是通过硬code或用户输入让我的初始值的事实。

As the else block, it does not work. I think it has something to do with the fact that I'm getting my initial values from the string.xml resource folder and not via hardcode or user input.

此问题已经折腾我自从2-3天前和帮助实在是AP preciated。谢谢你。

This problem has been frustrating me ever since 2-3 days ago and help is really appreciated. Thanks.

推荐答案

您只需要通知改变了你的适配器上的数据集

you just have to notify the data set Changed on your adapter

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

在ListView将自动更新

the listview will be updated automatically

更新
你总是可以使用下面的它会工作,但我preFER通知适配器。

UPDATE you can always use the following it'll work but I prefer notifying the adapter.

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

这篇关于Android的 - 更新列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆