【问题标题】:Add Item To Array List From Another Intent从另一个意图将项目添加到数组列表
【发布时间】:2017-02-18 09:34:44
【问题描述】:

我有一个包含 Book 对象的 ListView 的应用程序。我单击一个按钮,将我带到另一个活动 (AddBook),我可以在其中添加另一本书并将信息传递回 MainActivity。我可以创建原始 Book 对象并将其添加到 ListView,但如果我尝试通过单击添加按钮(在 MainActivity 上)添加第二本书并在返回 MainActivity 时再次通过 AddBook,我添加的第一本书将被替换通过第二个条目。我想我需要一个循环或条件,但我无法弄清楚。

我在第 94 行添加了 if 语句,因为在我填写 AddBook Activity 上的字段之前会自动添加该对象

    package com.the93rd.android.bookcatalog;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.Toast;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {

Button mAddBook;
public ArrayList<Book> books;
public ListView listView;
public BookListViewAdapter bookAdapter;

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

    //Array List of Book objects
    books = new ArrayList<>();

    books.add(new Book("J.K. Rolling", "Harry Potter and The Sorcerers Stone", 8,
            "0439708184", "Yes"));
    books.add(new Book("Eoin Colfer", "The Artic Accident", 5,
            "1423124529", "Yes"));
    books.add(new Book("George S. Clason", "The Richest Man in Babylon", 9,
            "1505339111", "No"));
    books.add(new Book("Khaled Hosseini", "The Kite Runner", 10,
            "159463193X", "Yes"));
    books.add(new Book("Daniel Keyes", "Flowers For Algernon", 8,
            "0156030306", "No"));

    listView = (ListView) findViewById(R.id.list);
    bookAdapter = new BookListViewAdapter(this, books);

    listView.setAdapter(bookAdapter);


    //Open BookDetails Activity to Display more book information
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            //Get ArrayList element
            Book book = books.get(position);

            //Get fields for current Book element
            String passAuthor = book.getAuthor();
            String passTitle = book.getTitle();
            int passRating = book.getRating();
            String passIsbn = book.getIsbn();
            String passSeries = book.getSeries();

            Toast.makeText(MainActivity.this, book.getAuthor(), Toast.LENGTH_SHORT).show();

            //Pass Extras for Book element to BookDetails Activity
            Intent openDetail = new Intent(MainActivity.this, BookDetails.class);
            openDetail.putExtra("Author", passAuthor);
            openDetail.putExtra("Title", passTitle);
            openDetail.putExtra("Rating", passRating);
            openDetail.putExtra("Isbn", passIsbn);
            openDetail.putExtra("Series", passSeries);
            startActivity(openDetail);
        }
    });

    //Open AddBook Activity
    mAddBook = (Button) findViewById(R.id.add_book);
    mAddBook.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent addBook = new Intent(MainActivity.this, AddBook.class);
            startActivity(addBook);
        }
    });

    //Get extras from AddBook Activity
    Intent intent = getIntent();

    String addAuthor = intent.getStringExtra("addAuthor");
    String addTitle = intent.getStringExtra("addTitle");
    String addRating = intent.getStringExtra("addRating");
    String addIsbn = intent.getStringExtra("addIsbn");
    String addSeries = intent.getStringExtra("addSeries");

    if(addAuthor != null){

        //Add variables from AddBook activity to new Book object
        books.add(new Book(addAuthor, addTitle, 5, addIsbn, addSeries));
        bookAdapter.notifyDataSetChanged();
    }

}

}

【问题讨论】:

    标签: java android listview android-intent arraylist


    【解决方案1】:

    您可以使用 startActivityForResult 而不是 startActivity,这样您就可以从 AdBook Activity 接收数据,例如

     package com.the93rd.android.bookcatalog;
    
        import android.content.Intent;
        import android.os.Bundle;
        import android.support.v7.app.AppCompatActivity;
        import android.view.View;
        import android.widget.AdapterView;
        import android.widget.Button;
        import android.widget.ListView;
        import android.widget.Toast;
    
        import java.util.ArrayList;
    
        public class MainActivity extends AppCompatActivity {
        Button mAddBook;
        public ArrayList<Book> books;
        public ListView listView;
        public BookListViewAdapter bookAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //Array List of Book objects
            books = new ArrayList<>();
    
            books.add(new Book("J.K. Rolling", "Harry Potter and The Sorcerers Stone", 8,
                    "0439708184", "Yes"));
            books.add(new Book("Eoin Colfer", "The Artic Accident", 5,
                    "1423124529", "Yes"));
            books.add(new Book("George S. Clason", "The Richest Man in Babylon", 9,
                    "1505339111", "No"));
            books.add(new Book("Khaled Hosseini", "The Kite Runner", 10,
                    "159463193X", "Yes"));
            books.add(new Book("Daniel Keyes", "Flowers For Algernon", 8,
                    "0156030306", "No"));
    
            listView = (ListView) findViewById(R.id.list);
            bookAdapter = new BookListViewAdapter(this, books);
    
            listView.setAdapter(bookAdapter);
    
    
            //Open BookDetails Activity to Display more book information
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    //Get ArrayList element
                    Book book = books.get(position);
    
                    //Get fields for current Book element
                    String passAuthor = book.getAuthor();
                    String passTitle = book.getTitle();
                    int passRating = book.getRating();
                    String passIsbn = book.getIsbn();
                    String passSeries = book.getSeries();
    
                    Toast.makeText(MainActivity.this, book.getAuthor(), Toast.LENGTH_SHORT).show();
    
                    //Pass Extras for Book element to BookDetails Activity
                    Intent openDetail = new Intent(MainActivity.this, BookDetails.class);
                    openDetail.putExtra("Author", passAuthor);
                    openDetail.putExtra("Title", passTitle);
                    openDetail.putExtra("Rating", passRating);
                    openDetail.putExtra("Isbn", passIsbn);
                    openDetail.putExtra("Series", passSeries);
                    startActivity(openDetail);
                }
            });
    
            //Open AddBook Activity
            mAddBook = (Button) findViewById(R.id.add_book);
            mAddBook.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    Intent addBook = new Intent(MainActivity.this, AddBook.class);
                    int requestCode = 1;
                    startActivityForResult(addBook, requestCode);
                }
            });
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            String addAuthor = data.getStringExtra("addAuthor");
            String addTitle = data.getStringExtra("addTitle");
            String addRating = data.getStringExtra("addRating");
            String addIsbn = data.getStringExtra("addIsbn");
            String addSeries = data.getStringExtra("addSeries");
    
            if(addAuthor != null){
                //Add variables from AddBook activity to new Book object
                books.add(new Book(addAuthor, addTitle, 5, addIsbn, addSeries));
                bookAdapter.notifyDataSetChanged();
            }
    
        }
    }
    

    在您的 adBookActivity 中,确保在关闭 Activity 之前调用 setResult(1, data)

    *将 1 (requestcode) 改成常量,让代码更具可读性

    【讨论】:

    • 谢谢我按照你说的做了,得到了我想要的结果
    【解决方案2】:

    我认为这是您应该使用 sqlite DB 的最佳方式。并从 sqlite db 表中设置列表框项目,它将快速运行您的应用程序。

    【讨论】:

    • 能否详细说明?
    • 首先您应该将数据保存到 sqlite DB。然后读取数据库并将其数据加载到您的应用程序并选择 ListView data scorce 作为加载数据的正确列。将数据保存到 SQlite:developer.android.com/training/basics/data-storage/… 帮助您。
    • 并将数据加载到列表视图:saigeethamn.blogspot.in/2011/02/… 帮助您。这将使您的应用程序更有效率。而且您可以保存大量数据,因为它不依赖于您的内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多