开始新活动后,ListView 会减少

Posted

技术标签:

【中文标题】开始新活动后,ListView 会减少【英文标题】:ListView depopulates after I start a new activity 【发布时间】:2016-01-04 07:19:53 【问题描述】:

我是使用 CustomAdapters 制作 ListViews 的新手(这是我的第一次尝试),但我不确定我做得如何/效率如何。所以我要做的是获取在 ListView 中以红色突出显示的名称。我使用 getSelectedName 方法执行此操作。但是,在 BuildInput 类中,当我意图返回 MainActivity 并意图返回 BuildInput 类时,ListView 完全消失了。由于 ListView 消失了,突出显示的红色名称也消失了,getSelectedName 方法也不起作用。

当我打算使用 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 类创建的:

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

【问题讨论】:

第一次设置一个空适配器,因为这个 arrayOfNames 数组是空的,否则不要调用 setAdapter 而是这样做 adapter.notifyDataSetChanged(); delete this from else listview = (ListView) findViewById(R.id.listview); 【参考方案1】:

我对您的代码进行了一些更改:

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 类创建内容的图片对我的帖子进行了一些编辑,并添加了有关该类的功能和我想要实现的目标的更多详细信息。 可能问题仍然存在,但我提到你做的事情完全错了【参考方案2】:

当您打算进入 MainActivity 而没有完成 BoardInputActivity 时,当 MainActivity 关闭时,ListView 仍然存在。但是,当您打算使用 BoardInputActivity 时,所有内容都将被重建,包括适配器。

【讨论】:

有什么方法可以让 BoardInputActivity 发生并阻止它重建所有内容? 我认为您应该将您的适配器模型保存到数据库中。构建视图后,获取所有存储的信息并重建适配器 是否有将适配器保存到数据库的特定/推荐方法?我不知道该怎么做。 你需要存储你的Names类,看看这个link

以上是关于开始新活动后,ListView 会减少的主要内容,如果未能解决你的问题,请参考以下文章

从列表中选择项目后如何开始活动?

将值从 ListView 传递到 EditText

ListView 单击然后使用自动数据转到其他活动

如何创建可点击的 Listview 并转到新页面

Android App 在片段中创建 ListView 引用时关闭

如何使 ListView 中的项目打开一个新的空活动