【问题标题】:Listview not updating after arraylist is updated?更新arraylist后Listview不更新?
【发布时间】:2016-06-26 18:24:27
【问题描述】:

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

我在适配器类中使用了 notifyDataSetChanged()。没有结果!我在活动中使用了 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;
}


}

}

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

【问题讨论】:

  • 每次更新列表时使用 notifyDataSetChanged()。
  • lvfid.setAdapter 应该只做一次我认为

标签: android listview adapter


【解决方案1】:

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

【讨论】:

  • 其实我已经做到了,但没有结果!我更新了问题以添加 notifyDataSetChanged() 方法。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:
    1. 选项

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

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

    1. 其他选项:

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

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

    【讨论】:

      【解决方案4】:
      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();
      
               }
        });
      }
      

      【讨论】:

      • 谢谢,但这是否经过测试? lvfid.setAdapter 不能在 onCreate 调用,因为它 lvfid 在对话上下文中!
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 2015-07-08
        • 1970-01-01
        • 2020-09-10
        相关资源
        最近更新 更多