将字符串添加到来自不同活动的ListView只替换第一个项目,而不是将更多项目添加到列表中

问题描述:

我正在开发一个项目,该项目允许用户使用按钮将字符串从一个活动发送到另一个活动的列表视图。但是,当我尝试将数据从一个活动发送到下一个活动时,接收活动会替换发送的最后一个项目,而不是添加到列表视图。这里是我的代码: EnterInfoActivity.java:将字符串添加到来自不同活动的ListView只替换第一个项目,而不是将更多项目添加到列表中

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.Toast; 

import static com.example.kevin.myapplication.R.id.Done; 
import static com.example.kevin.myapplication.R.id.EnterInfo; 

public class EnterInfoActivity extends AppCompatActivity { 
ArrayAdapter<CharSequence> yearAdapter; 
Button Done; 
EditText Name; 
EditText PName; 
Spinner YearSpinner; 

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

    Name = (EditText) findViewById(R.id.Name); 
    PName = (EditText) findViewById(R.id.PName); 
    Done = (Button) findViewById(R.id.Done); 
    YearSpinner = (Spinner) findViewById(R.id.Year); 
    yearAdapter = ArrayAdapter.createFromResource(this,R.array.year_sequence, android.R.layout.simple_spinner_item); 
    yearAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    YearSpinner.setAdapter(yearAdapter); 



    Done.setOnClickListener(new View.OnClickListener() { 
     @Override 

     public void onClick(View v) { 

      SharedPreferences sharedPreferences = getSharedPreferences("ViewData", Context.MODE_PRIVATE); 
      SharedPreferences.Editor editor = sharedPreferences.edit(); 
      editor.putString("newName", Name.getText().toString()); 
      editor.putString("newPName", PName.getText().toString()); 
      editor.putString("Year", YearSpinner.getSelectedItem().toString()); 
      editor.commit(); 
      finish(); 
     } 
    }); 
} 

}

和继承人ViewActivity.java:

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.ListViewCompat; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class ViewActivity extends AppCompatActivity { 
ListView lv; 
ArrayList<String> arrayList; 
ArrayAdapter<String> adapter; 
public static final String DEFAULT = " "; 

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

    SharedPreferences sharedPreferences = getSharedPreferences("ViewData", Context.MODE_PRIVATE); 


    String Name = sharedPreferences.getString("newName",DEFAULT); 
    String PName = sharedPreferences.getString("newPName",DEFAULT); 
    String Year = sharedPreferences.getString("Year",DEFAULT); 

    String PhotoInfo =(Name + " " + PName + " " + Year); 

    lv = (ListView) findViewById(R.id.LV_View); 
    arrayList = new ArrayList<String>(); 
    arrayList.add(PhotoInfo); 
    adapter = new ArrayAdapter<String>(ViewActivity.this, android.R.layout.simple_list_item_1, 
       arrayList); 
    lv.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 

} 

}

+0

你没有通过你传递只有三个,我不和你的字串PhotoInfo – Xenolion

+0

读有关Android应用程序生命周期已经联合列表:在OnCreate - 在onStart - 的onResume ......后来,我会建议使用'BroadcastReceiver'将数据可靠地发送到其他活动 – rupps

在乌尔ArrayList中,你总是最后一个。还有就是你要添加到,因此它只能显示你的最后一个

ArrayList<String> arrayList; 

--- 

arrayList = new ArrayList<String>(); 
arrayList.add(PhotoInfo); 

从最后两行可以看出U,U正在创造一个新的列表,只需添加一个字符串它没有现成的名单。因此,你可以看到最后一个。

您必须将您的ArrayList设置为静态,并且不要每次更新!您只需创建一次,并且每次只需将新的项目添加到它并且请致电notifyDatasetChanged()

public class ViewActivity extends AppCompatActivity { 
ListView lv; 
//set arraylist as static and eager loading for it. 
public static ArrayList<String> arrayList=new ArrayList<String>(); 
ArrayAdapter<String> adapter; 
public static final String DEFAULT = " "; 

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

    SharedPreferences sharedPreferences = getSharedPreferences("ViewData", Context.MODE_PRIVATE); 


    String Name = sharedPreferences.getString("newName",DEFAULT); 
    String PName = sharedPreferences.getString("newPName",DEFAULT); 
    String Year = sharedPreferences.getString("Year",DEFAULT); 

    String PhotoInfo =(Name + " " + PName + " " + Year); 

    lv = (ListView) findViewById(R.id.LV_View); 
    //remove renew arraylist 
    arrayList.add(PhotoInfo); 
    adapter = new ArrayAdapter<String>(ViewActivity.this, android.R.layout.simple_list_item_1, 
       arrayList); 
    lv.setAdapter(adapter); 
    //its ok 
    adapter.notifyDataSetChanged(); 

} 
+1

感谢您解决了我的问题! – chowmein4u