有关更新自定义Listview的建议

时间:2014-03-17 07:21:13

标签: android android-listview

我对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);
    }
}

我现在所有的想法都没有...谢谢!

3 个答案:

答案 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;
}