2016-06-26 70 views
0

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

我已经在适配器类中使用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; 
} 


} 

} 

更新: 对不起,我花了大家的时间。愚蠢的问题是,我的列表视图在滚动视图内,它不能!我希望这可以帮助那些有同样问题的人!

+0

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

+1

lvfid.setAdapter应该只做一次,我认为 – user3793589

回答

0

对不起,我把每个人的时间!这个愚蠢的问题只是我的listview是在一个滚动视图内,它不能!从scrollview中获得列表视图后,问题得到解决。

0

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

+0

其实我已经做到了,但没有结果!我更新了问题以添加notifyDataSetChanged()方法。 – sinfa

0

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

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

1.定义一个计数器。
2.检查按钮被按下时,增加计数器由一个
每次检查计数器,如果计数器大于1则意味着该按钮被点击超过一次,以便更新列表视图新的变量(arrayList, FeildAdapter)

我建议你定义变量作为私有类领域,并将其命名,如refreshedArrayListrefreshedAdapter

0
  1. 选项

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

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

  • 其他选项:
  • 添加一个附加功能,在添加字段适配器您FieldAdapter的对象添加到ArrayList和调用notifiyDataSetChanged(适配器具有ASLO一个和适配器通知他的所有观察者)

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

    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(); 
    
         } 
        }); 
    } 
    
    +0

    谢谢,但这是测试?无法在onCreate调用lvfid.setAdapter,因为它的lvfid位于对话框上下文中! – sinfa

    +0

    使用上面编辑的代码。 – Drv