【问题标题】:ListView displays item after 2nd item has been createdListView 在创建第二个项目后显示项目
【发布时间】:2013-02-14 18:34:19
【问题描述】:

所以我的代码中有一个奇怪的事件顺序。这可能是我还没见过的小事。 A 有ListView,并且在单击按钮后从EditText 中拉出字符串。

EditText 存在于一个对话框中,该对话框被interface 拉回主Activity

现在发生的情况是,当我在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);
    }
}

}

任何人都可以发现发生这种情况的地方吗?

【问题讨论】:

    标签: android android-listview android-fragments android-arrayadapter android-fragmentactivity


    【解决方案1】:

    简单。

    致电arrayAdapter.notifyDataSetChanged()

    public void onSignIn(String inputText) {
        siteList.add(inputText);
        //add that here
    }
    

    【讨论】:

      【解决方案2】:

      如果您的适配器支持的数据发生变化,您需要调用适配器上的notifyDataSetChanged() 来指示ListView 进行自我更新。

      我在您的代码中没有看到类似的内容。

      只是补充:

      您的适配器实现是次优的 - 尽管在这种情况下它并不重要。 您应该创建一个 ViewHolder 并将其存储为 View 的标签,以便在给出 convertView 时可以检索它。 ViewHolder 应该保留对您视图的所有子视图的引用(TextViewImageView,无论您需要更新什么)。这样可以避免重复调用 findViewById() - 这很慢。

      【讨论】:

      • 大约一个小时前刚看了那个 google IO 视频……我完全明白你在说什么 :)
      猜你喜欢
      • 2020-02-28
      • 2015-03-28
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多