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 字段并将它们命名为 refreshedArrayList
和 refreshedAdapter
- 选项
尝试使用ArrayAdapter。并且不要每次都创建一个新的适配器
当您点击按钮时。
仅从 ArrayAdapter 调用 add(T o) 函数。
- 其他选项:
在添加字段适配器中向您的 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();
}
});
}
对不起,我耽误了大家的时间!愚蠢的问题只是我的列表视图在滚动视图中,而它不能在其中!从滚动视图中获取列表视图后,问题就解决了。
我在这方面看过许多其他帖子,但 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 字段并将它们命名为 refreshedArrayList
和 refreshedAdapter
- 选项
尝试使用ArrayAdapter。并且不要每次都创建一个新的适配器 当您点击按钮时。
仅从 ArrayAdapter 调用 add(T o) 函数。
- 其他选项:
在添加字段适配器中向您的 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();
}
});
}
对不起,我耽误了大家的时间!愚蠢的问题只是我的列表视图在滚动视图中,而它不能在其中!从滚动视图中获取列表视图后,问题就解决了。