我对android很新(我是一个新手,我知道:/),我想知道如何继续。
我正在编写一个从服务器获取数据的应用程序,将其保存到SQLite表并将其显示在列表中。问题是,我不知道在从服务器刷新数据时应该如何更新列表视图。现在我只是每次都重置适配器,但肯定有一种更有效的方法。我在notifydatasetchanged()
上看了很多,但我还是不确定如何使用它。有什么想法吗?
ListAdapter:
private class MyListAdapter extends ArrayAdapter<Plants> {
private final LayoutInflater mInflater;
ItemInfo info = new ItemInfo();
public MyListAdapter(Context c) {
super(c, R.layout.list_item, myPlants);
mInflater = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView;
if (convertView == null) {
itemView = mInflater.inflate(R.layout.list_item, parent, false);
} else {
itemView = convertView;
}
// Find the Plant to work with.
Plant currentPlant = myPlants.get(position);
// Plant number:
TextView plantText = (TextView) itemView
.findViewById(R.id.plantID);
plantText .setText("Plant: " + currentPlant .getPlantID());
// Information string:
TextView infoText = (TextView) itemView.findViewById(R.id.state);
infoText.setText("Status: "
+ info.getStatus(currentPlant.getState()) + " at "
+ info.getLocation(currentPlant.getLocation()));
// Grey out checked out plants
if (currentPlant.getState().equals("3")) {
itemView.setBackgroundColor(Color.LTGRAY);
}
return itemView;
}
}
我正在调用此方法来更新列表:
private List<Plant> myPlants = new ArrayList<Plant>();
public void updateList() {
// Get everything back from database
try {
SQLHelper getHelper = new SQLHelper(getActivity());
getHelper.open();
myPlants = getHelper.getData();
getHelper.close();
} catch (Exception e) {
iError = 2;
}
// Updating database data into ListVIew
if (myPlants != null) {
ArrayAdapter<Package> adapter = new MyListAdapter(getActivity());
setListAdapter(adapter);
}
}
我现在所有的想法都没有...谢谢!
答案 0 :(得分:0)
例如,您已打开listView并长按项目您可以将其删除以便立即查看更改您应该使用notifyDataSetChanged()。当您的列表更新时,它会起作用。
答案 1 :(得分:0)
适配器维护对您在定义时指定的相同列表的引用 在适配器构造函数中, myPlants
super(c, R.layout.list_item, myPlants);
当您获得新的项目列表时,请不要创建新列表并进行分配。
而是将新列表中的项目复制到 myPlants 并调用notifyDataSetChanged()
适配器
List<Plant> newList = null;
try {
SQLHelper getHelper = new SQLHelper(getActivity());
getHelper.open();
newList = getHelper.getData();
getHelper.close();
}
catch (Exception e) {
iError = 2;
}
if (newList != null)
{ myPlants.clear();
myPlants.addAll(newList);
runOnUiThread(new Runnable()
{
@Override
public void run()
{
adapter.notifyDataSetChanged();
}
});
}
答案 2 :(得分:0)
看看这个Question & Answer。这里的一些细节将帮助您了解notifydatasetchanged()的用法。此外,答案上共享的视频链接最有帮助。显然notifydatasetchanged()是最好的方式,而不是自定义刷新。还this one。
当您从服务器/数据库获取最新数据时,您只需要调用notifydatasetchanged(),一个非常糟糕的做法是每次都创建一个新的适配器。希望您拥有基于事件的功能,例如&#34;刷新按钮&#34;或者&#34;向下滚动以刷新&#34;,以获取您必须刷新视图的事件。
您的 getView 应该由此
修改public View getView(int position, View convertView, ViewGroup parent) {
View itemView;
if (convertView == null) {
itemView = mInflater.inflate(R.layout.list_item, parent, false);
} else {
itemView = convertView;
}
// Find the Plant to work with.
Plant currentPlant = myPlants.get(position);
if(itemView!=null){
// Plant number:
TextView plantText = (TextView) itemView
.findViewById(R.id.plantID);
plantText .setText("Plant: " + currentPlant .getPlantID());
// Information string:
TextView infoText = (TextView) itemView.findViewById(R.id.state);
infoText.setText("Status: "
+ info.getStatus(currentPlant.getState()) + " at "
+ info.getLocation(currentPlant.getLocation()));
}
// Grey out checked out plants
if (currentPlant.getState().equals("3")) {
itemView.setBackgroundColor(Color.LTGRAY);
}
return itemView;
}