arraylist 更新后 Listview 不更新?

Listview not updating after arraylist is updated?

我在这方面看过许多其他帖子,但 none 有所帮助。问题是当我单击 addField 按钮时,对话框中的列表视图仅添加一次新视图。但是在其他点击中它没有得到更新虽然适配器工作正常(我的意思是调用了 getView 并且适配器中的 arrayList 的大小也发生了变化)。

我在适配器中使用了 notifyDataSetChanged() class。没有结果!我在 activity 中使用了一个 adpater class 实例并调用了 myAdapter.notifyDataSetChanged()。没有结果!

这是我的代码:

public class MainActivity extends Activity {

ListView lvfid;
FieldAdapter fAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //some code
    showFid();
}

private void showFiD(){
    final ArrayList <HashMap<String,String>> al = new ArrayList<HashMap<String,String>>();
    final Dialog dialog = new Dialog(MainActivity.this , R.style.DialogTheme);
    dialog.setContentView(R.layout.field_dialog);
    dialog.setCancelable(true);
    dialog.show();
    Button addField = (Button) dialog.findViewById(R.id.btnfidField);
    lvfid = (ListView) dialog.findViewById(R.id.lvfid);
    //Another plan i have tested, but no result:
    //fAdapter = new FieldAdapter(dialog.getContext(),al);
    //lvfid.setAdapter(fAdapter);
    addField.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            HashMap<String,String> h = new HashMap<String,String>();
            h.put("name", "");
            h.put("value", "");
            al.add(h);
            lvfid.setAdapter(new FieldAdapter(dialog.getContext(), al));
            //fAdapter.notifyDataSetChanged();

        }
    });
}

public class FieldAdapter extends BaseAdapter{

private ArrayList <HashMap <String,String>> arrayList;
private LayoutInflater inflater;

public FieldAdapter(Context context, ArrayList<HashMap <String,String>> arrayList) {
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.arrayList = arrayList;
}

@Override
public int getCount() {
    return arrayList.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}


@Override
public View getView(int position, View convertView, ViewGroup arg2) {
    View view = null;
    if (convertView == null)
        view = inflater.inflate(R.layout.field_inflater, null);
     else 
        view = convertView;
    Holder holder = new Holder();
    holder.edName     = (EditText) view.findViewById(R.id.edfidName);
    holder.edValue     = (EditText) view.findViewById(R.id.edfidValue);
    //holder.edName.setText(arrayList.get(position).get("name"));
    //holder.edValue.setText(arrayList.get(position).get("value"));
    return view;
}

private class Holder {
    private EditText edName;
    private EditText edValue;
}


}

}

更新: 对不起,我占用了大家的时间。愚蠢的问题是我的列表视图在滚动视图中,而它不应该在!我希望这可以帮助其他有同样问题的人!

每次更新列表时使用 notifyDataSetChanged()。

我遇到了同样的问题。当我想在 onDateChanged() 之后更新 listView 时,我遇到了这个问题。在你的情况下,我用一个额外的 ArrayList 变量和一个额外的自定义适配器解决了它 FieldAdapter 变量。

在任何操作后使用刷新适配器和数组列表变量更新您的列表视图。例如在按钮点击之后。

1.定义一个计数器。
2. 检查按钮何时被点击,计数器加一
3. 每次检查计数器,如果计数器大于 1,则表示按钮被点击了不止一次,因此用新变量更新列表视图 (arrayList, FeildAdapter)

我建议您将变量定义为私有 class 字段并将它们命名为 refreshedArrayListrefreshedAdapter

  1. 选项

尝试使用ArrayAdapter。并且不要每次都创建一个新的适配器 当您点击按钮时。

仅从 ArrayAdapter 调用 add(T o) 函数。

  1. 其他选项:

在添加字段适配器中向您的 FieldAdapter 添加一个添加函数将对象添加到您的数组列表并调用 notifiyDataSetChanged(适配器有一个并且适配器通知他的所有观察者)

也不要在每次单击按钮时都创建新的适配器。

public class MainActivity extends Activity {

ListView lvfid;
FieldAdapter fAdapter;
ArrayList <HashMap<String,String>> al ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //some code

    al = new ArrayList<HashMap<String,String>>();
    lvfid.setAdapter(new FieldAdapter(MainActivity.this , al));

    showFid();
    }

    private void showFiD(){
         final Dialog dialog = new Dialog(MainActivity.this , R.style.DialogTheme);
         dialog.setContentView(R.layout.field_dialog);
         dialog.setCancelable(true);
         dialog.show();
         Button addField = (Button) dialog.findViewById(R.id.btnfidField);
         lvfid = (ListView) dialog.findViewById(R.id.lvfid);
         //Another plan i have tested, but no result:
         //fAdapter = new FieldAdapter(dialog.getContext(),al);
         //lvfid.setAdapter(fAdapter);
         addField.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View arg0) {
             HashMap<String,String> h = new HashMap<String,String>();
             h.put("name", "");
             h.put("value", "");
             al.add(h);
             fAdapter.notifyDataSetChanged();

         }
  });
}

对不起,我耽误了大家的时间!愚蠢的问题只是我的列表视图在滚动视图中,而它不能在其中!从滚动视图中获取列表视图后,问题就解决了。