所以我的代码中有一个奇怪的事件顺序。它可能是我未见过的小事。 A有ListView
,并且在按下按钮后从EditText
拉出字符串。
EditText
位于一个对话框中,该对话框被Activity
interface
现在发生的事情是,当我在EditText
字段中输入“a”字样时,没有显示任何内容。但是当我去添加另一个时,“b”,“a”出现了。等等。因此必须创建一个以便显示之前的内容。
这是我的所作所为。
public class NewActivity extends FragmentActivity implements AddSiteDialog.AddSiteDialogListener {
ListView mSiteListView;
ArrayList<String> siteList = new ArrayList<String>();
CustomAdapter arrayAdapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_site);
mSiteListView = (ListView) findViewById(R.id.siteAddList);
arrayAdapter = new CustomAdapter();
mSiteListView.setAdapter(arrayAdapter);
Button b = (Button) findViewById(R.id.addSiteButton);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
}
public void showDialog() {
FragmentManager fm = getSupportFragmentManager();
AddSiteDialog addSiteDialog = new AddSiteDialog();
addSiteDialog.show(fm, "main");
}
public void onSignIn(String inputText) {
siteList.add(inputText);
}
class CustomAdapter extends ArrayAdapter<String> {
CustomAdapter() {
super(NewActivity.this, R.layout.add_site, siteList);
}
public View getView(int position, View convertView, ViewGroup parent){
View row = convertView;
if (row == null){
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.list_row, parent, false);
}
((TextView) row.findViewById(R.id.textViewId)).setText(siteList.get(position));
return (row);
}
}
}
有人能发现这种情况发生在哪里吗?
答案 0 :(得分:1)
在
中拨打arrayAdapter.notifyDataSetChanged()
public void onSignIn(String inputText) {
siteList.add(inputText);
//add that here
}
答案 1 :(得分:0)
如果适配器支持的数据发生变化,您需要调用适配器上的notifyDataSetChanged()
来指示ListView
自行更新。
我的代码中没有看到类似内容。
添加:
您的适配器实现是次优的 - 尽管在这种情况下它并不重要。
您应该创建一个ViewHolder并将其存储为View的标记,以便在给出convertView时可以检索它。 ViewHolder应该保留对视图的所有子视图的引用(TextView
,ImageView
,无论您需要更新什么)。这样可以避免重复调用findViewById()
- 这很慢。