簡體   English   中英

添加新的ListView項目並從另一個活動中獲取項目的價值

[英]Adding new ListView item and get value of item from another activity

我正在嘗試使用Android Studio創建“新聞應用程序”。 我的主要活動有一個ListView和一個floating button 在第二個活動中,我得到了two TextViewstwo EditViewsone Button 我要執行的操作如下:首先,我從主“活動”中按下floating Button 然后第二個活動應該彈出,在那兒我寫two EditText's ,然后按一下button 之后,我應該回到主要活動,在那里,應該將新的Item添加到ListView。 新項目應填充第二個活動的EditTexts中的文本。

這是我的主要活動:

package news;

import android.content.Intent;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Get subject value from addpost Activity
        final String new_value = getIntent().getStringExtra("newSubject");

        String [] new_subject = new String []
                {new_value};

        FloatingActionButton add_post_button = findViewById(R.id.post_btn);
        final ListView post_view = findViewById(R.id.news_feed);
        //Create Adapter to add the new subject to listview
        if (new_subject != null) {
            ArrayAdapter newslist_adapter = new ArrayAdapter(
                    MainActivity.this,
                    android.R.layout.simple_expandable_list_item_1, new_subject);
            post_view.setAdapter(newslist_adapter);
        }
        add_post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, addpost_activity.class);
                MainActivity.this.startActivity(intent);
            }
        });
    }
}

這是第二個活動(addpost_activity):

package news;

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

import java.util.ArrayList;


public class addpost_activity extends AppCompatActivity {

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

        Button post_button = findViewById(R.id.post_btn);
        final EditText subject_text = findViewById(R.id.subject_edit);

        post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(subject_text.getText() != null) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("newSubject", subject_text.getText().toString());
                    startActivity(intent);
                }
            }
        });
    }
}

我的問題是,現在每次啟動該應用程序時都會崩潰。 我也從日志中得到以下消息:

java.lang.NullPointerException:嘗試在空對象引用上調用虛擬方法“ java.lang.String java.lang.Object.toString()”


已解決:感謝Munir,問題得以解決。

這是我的活動

主要活動:

package news;

import android.app.Activity;
import android.content.Intent;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ArrayAdapter newslist_adapter;
    ArrayList<String> new_subject = new ArrayList<>();

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

        FloatingActionButton add_post_button = findViewById(R.id.post_btn);

        //Create Adapter to add the new subject to listview
        add_post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, addpost_activity.class);
                startActivityForResult(intent, 1);

            }
        });

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final ListView post_view = findViewById(R.id.news_feed);
        if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){
                String new_value = data.getStringExtra("newSubject");
                new_subject.add(new_value);
                newslist_adapter = new ArrayAdapter(
                        MainActivity.this,
                        android.R.layout.simple_expandable_list_item_1, new_subject);
                post_view.setAdapter(newslist_adapter);

            }
        }
    }
} 

這是我的第二個活動(addpost_activity):

package news;

import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.content.Intent;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;


public class addpost_activity extends AppCompatActivity {

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

        Button post_button = findViewById(R.id.post_btn);
        final EditText subject_text = findViewById(R.id.subject_edit);

        post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(subject_text.getText() != null) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("newSubject", subject_text.getText().toString());
                    setResult(Activity.RESULT_OK, intent);
                    finish();
                }
            }
        });
    }
}

為此,我建議使用Fragments而不是兩個Activities 然后, MainActivity將保存您的所有數據。

請參閱片段指南

從您的MainActivity調用使用startActivityForResult()方法而不是startActivity();addpost_activity startActivity();

在您的addpost_activity設置要返回到FirstActivity

post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(subject_text.getText() != null) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("newSubject", subject_text.getText().toString());
                    setResult(Activity.RESULT_OK,intent );
                   finish();

                }
            }
        });

MainActivity ,通過覆蓋onActivityResult()訪問結果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("newSubject");
           //Add this value to your adapter and call notifyDataSetChanged();
        }

    }
}

如果要在列表中保留舊條目,請使用由String []插入的ArrayList,如下所示更改代碼。

主要活動

將此變量聲明為全局變量

ArrayAdapter newslist_adapter;
ArrayList<String> new_subject = new ArrayList<>();

設置適配器像

newslist_adapter = new ArrayAdapter(
                    MainActivity.this,
                    android.R.layout.simple_expandable_list_item_1, new_subject);
            post_view.setAdapter(newslist_adapter);

將startActivity更改為startActivityForResult

 add_post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, addpost_activity.class);
                startActivityForResult(intent,100);
            }
        });

在onActivity中覆蓋此方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 100) {
            String result=data.getStringExtra("newSubject");
new_subject.add(result)
           //Add this value to your adapter and call newslist_adapter.notifyDataSetChanged();

    }
}

然后在您的addpost_activity中設置要返回的數據

post_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(subject_text.getText() != null) {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.putExtra("newSubject", subject_text.getText().toString());
                    setResult(100,intent );
                   finish();

                }
            }
        });

在MainActivity.java中,您應該覆蓋一個名為“ onActivityRecsult”的函數,當您從第二個活動返回到第一個活動時,將調用此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM