启动新活动后,ListView清空了

3
我刚开始尝试使用CustomAdapters制作ListViews(这是我第一次尝试),不确定我的做法是否正确或高效。现在我想要获取ListView中突出显示为红色的名称。我通过getSelectedName方法进行操作。但是,在BuildInput类中,当我跳转到MainActivity并返回到BuildInput类时,ListView完全消失了。由于ListView消失了,所以突出显示的红色名称也消失了,getSelectedName方法也无法正常工作。
如何确保Intent到MainActivity时不会清空ListView?
public class Names {
    public String name;
    public Names(){
        super();
    }
    public Names(String name){
        super();
        this.name = name;

-

public class CustomAdapter extends ArrayAdapter<Names>{

private ArrayList<Names> items;
private TextView tvHolder;
private String selectedName = "";

public CustomAdapter (Context context, ArrayList<Names> items){
    super(context, 0, items);
    this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Names names = getItem(position);
    if(convertView == null)
    {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_namechoices, parent, false);

    }
    Names nm = items.get(position);
    if (nm != null){
        final TextView tv = (TextView)convertView.findViewById(R.id.nameItem);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (tvHolder != null) {
                    tvHolder.setBackgroundColor(Color.WHITE);
                    v.setBackgroundColor(Color.RED);
                    tvHolder = tv;
                    selectedName = tv.getText().toString();
                } else {
                    v.setBackgroundColor(Color.RED);
                    tvHolder = tv;
                    selectedName = tv.getText().toString();
                }
            }
        });
    }
    TextView tv = (TextView)convertView.findViewById(R.id.nameItem);
    tv.setText(names.name);
    return convertView;
}

public String getSelectedName(){
    return selectedName;
}
}

-

public class BoardInput extends Activity {

private EditText mUserInput;
private Button mConfirm;
private Button mReady;
private ArrayList<Names> arrayOfNames = new ArrayList<Names>();
private CustomAdapter adapter;
private ListView listview;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_boardinput);

    adapter = new CustomAdapter(BoardInput.this, arrayOfNames);
    listview = (ListView) findViewById(R.id.listview);
    listview.setAdapter(adapter);

    mUserInput = (EditText) findViewById(R.id.nameInput);
    mConfirm = (Button) findViewById(R.id.confirm);
    mConfirm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mUserInput.getText().toString().equals("")) {
                Toast.makeText(getApplicationContext(), "Please enter a name.", Toast.LENGTH_SHORT);
            } else {
                arrayOfNames.add(new Names(mUserInput.getText().toString()));
                mUserInput.setText("");
                adapter = new CustomAdapter(BoardInput.this, arrayOfNames);
                listview = (ListView) findViewById(R.id.listview);
                listview.setAdapter(adapter);
            }

        }
    });
    mReady = (Button) findViewById(R.id.ready);
    mReady.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            if (adapter.getSelectedName().isEmpty()){
                Log.d("NULL","NULL");
            }
            else{
                Log.d("BoardInput", adapter.getSelectedName());
                Intent i = new Intent(BoardInput.this, MainActivity.class);
                startActivity(i);
            }
        }
    });

}

这就是 BoardInput 类创建的内容:

enter image description here

您在编辑框中输入名称,点击确认将名称添加到列表视图并清除编辑框。当您在列表视图中单击名称时,它将突出显示为红色,这就是我需要在我的MainActivity类中使用的名称。


第一次设置空适配器,因为这个arrayOfNames数组是空的,在else情况下不要调用setAdapter,而是使用adapter.notifyDataSetChanged(); - Syed Nazar Muhammad
从else中删除以下内容 listview = (ListView) findViewById(R.id.listview); - Syed Nazar Muhammad
2个回答

2

我已经对你的代码做了一些修改:

public class BoardInput extends Activity {

private EditText mUserInput;
private Button mConfirm;
private Button mReady;
private List<String> names = new ArrayList<>();
private ArrayList<Names> arrayOfNames = new ArrayList<Names>();
private CustomAdapter adapter;
private ListView listview;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_boardinput);

    adapter = new CustomAdapter(BoardInput.this, arrayOfNames);
    listview = (ListView) findViewById(R.id.listview);
    listview.setAdapter(adapter);

    mUserInput = (EditText) findViewById(R.id.nameInput);
    mConfirm = (Button) findViewById(R.id.confirm);
    mConfirm.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mUserInput.getText().toString().equals("")) {
                Toast.makeText(getApplicationContext(), "Please enter a name.", Toast.LENGTH_SHORT);
            } else {
                arrayOfNames.add(new Names(mUserInput.getText().toString()));
                mUserInput.setText("");
    **Edited**:
                adapter.notifyDataSetChanged();
    listview.invalidateView();
            }

        }
    });
    mReady = (Button) findViewById(R.id.ready);
    mReady.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            if (adapter.getSelectedName().isEmpty()){
                Log.d("NULL","NULL");
            }
            else{
                Log.d("BoardInput", adapter.getSelectedName());
                Intent i = new Intent(BoardInput.this, MainActivity.class);
                startActivity(i);
            }
        }
    });

}

使用编辑后的代码后,adapter.getSelectedName仍然为空,所以我无法进入MainActivity。我删除了if语句,只是为了测试如果我去到MainActivity并返回,ListView是否会减少,结果它确实减少了。我稍微编辑了我的帖子,添加了BoardInput类创建的图片,并添加了更多关于该类的细节以及我想要实现的内容。 - Visualizes
问题可能仍然存在,但我提到的事情你完全做错了。 - Syed Nazar Muhammad

1
当您意图到MainActivity并且没有完成BoardInputActivity时,ListView将在MainActivity关闭时仍然存在。但是,当您意图到BoardInputActivity时,包括适配器在内的所有内容都将被重建。

有没有办法我可以意图到BoardInputActivity并防止它重新构建所有内容? - Visualizes
我认为应该将适配器模型保存到数据库中。当你的视图被构建时,获取所有存储的信息并重新构建适配器。 - Richard Olthuis
有没有特定/推荐的方法将适配器保存到数据库中?我不确定该如何做。 - Visualizes
你需要存储你的Names类,请查看这个链接:链接 - Richard Olthuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接