arraylist更新后Listview没有更新?

时间:2016-06-26 18:24:27

标签: android listview adapter

我在这种情况下看过很多其他帖子,但没有人帮忙。问题是当我点击addField按钮时,listview里面的listview只添加一次新视图。但是在其他点击它虽然适配器工作正常但没有得到更新(我的意思是调用了getView,并且适配器中的arrayList也改变了大小)。

我在适配器类中使用了notifyDataSetChanged()。没有结果!我在activity中使用了一个adpater类实例,并调用了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;
}


}

}

更新: 对不起,我抓住了每个人的时间。愚蠢的问题是我的listview在一个滚动视图里面,它一定不是!我希望这有助于其他有同样问题的人!

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在执行任何操作后,使用刷新适配器和数组列表变量更新listView。例如,按钮点击后。

1。定义一个计数器 2. 检查点击按钮的时间,将计数器增加一 3. 每次检查计数器时,如果计数器大于1,则意味着多次单击该按钮,因此使用新变量更新列表视图(arrayList, FeildAdapter)

我建议您将变量定义为私有类字段,并将其命名为refreshedArrayListrefreshedAdapter

答案 2 :(得分:0)

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

    只调用ArrayAdapter中的add(T o)函数。

    1. 其他选项:
    2. 在添加字段适配器中向FieldAdapter添加一个add函数,将对象添加到arraylist并调用notifiyDataSetChanged(适配器具有aslo,适配器通知所有观察者)

      每次点击按钮时,

      也不会创建新的适配器。

答案 3 :(得分:0)

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();

         }
  });
}

答案 4 :(得分:0)

对不起我带走了每个人的时间!愚蠢的问题只是我的listview在一个滚动视图内,它一定不是!从滚动视图中获取listview之后,问题就解决了。