迭代ListView并根据其内容删除列表项

时间:2013-08-25 09:40:49

标签: android listview android-listview

我有一个ListView设置,我动态添加项目,每个项目都有不同的数据。其中一个数据是时间/日期,显示在我的自定义列表项布局中的TextView中。在我的Fragment的onResume()方法中,我想删除显示日期在当前日期之前的项目。

列表项布局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pi_rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/pi_tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp" />

    <TextView
        android:id="@+id/pi_tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/pi_tv_title"
        android:textSize="24sp" />


</RelativeLayout>

我必须解决这个问题的想法是创建一个循环,循环遍历所有项目,检查每个项目的日期TextView的内容。然后,如果日期在当前日期之前,它将删除该项目。

我目前能够根据位置删除项目,但如果他们有特定内容我无法弄清楚如何删除单个列表项目。

这是我到目前为止所做的:

@Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        int items = DataModel.getInstance().getPendingItemList().size(); // Number of items in the list

        if (items > 0) {
            for (int i = 1; i <= items; i++) { // This loops through all my items. Do I want to use position instead?
                Log.i("for loop", "" + i);

// This doesn't work because it tries to get the content for all the items not just one.

                TextView tv_date = (TextView) getView()
                        .findViewById(R.id.pi_tv_date);

                CharSequence c = tv_date.getText(); // Causes force close

                                 // Here I will have my if(date shown != current date){
//deleteItem
//}

            }

        }

    }

编辑:这是我的适配器代码:

private class PendingAdapter extends BaseAdapter { // This happens whenever
                                                    // onCreate is called.

    private List<Map<String, Object>> mPendingItemList;

    public PendingAdapter() {
        mPendingItemList = DataModel.getInstance().getPendingItemList();
    }

    @Override
    public int getCount() {
        return mPendingItemList.size();
    }

    @Override
    public Object getItem(int position) {
        return mPendingItemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (null == convertView) {
            convertView = LayoutInflater.from(getActivity()).inflate(
                    R.layout.pending_item, null);
            // Log.i("convertView", "was null");
        }

        TextView tv_title = (TextView) convertView
                .findViewById(R.id.pi_tv_title);

        TextView tv_date = (TextView) convertView
                .findViewById(R.id.pi_tv_date);

        HashMap<String, String> itemDataHashMap = (HashMap<String, String>) getItem(position);

        tv_title.setText(itemDataHashMap.get("planet"));
        tv_date.setText(itemDataHashMap.get("date"));

        return convertView;
    }
}

编辑2:

根据Ali AlNoaimi的回答,我在适配器中添加了这个:

public void refreshMyAdapter() {

            if(mPendingItemList.size() > 0) {
            List<Map<String, Object>> newPendingList = mPendingItemList;

            for (int i = 0; i < mPendingItemList.size(); i++) {
                Map<String, Object> item = mPendingItemList.get(i);

                TextView tv_title = (TextView) histView
                        .findViewById(R.id.pi_tv_title);

                String s_title;

                s_title = tv_title.getText().toString();

                 Log.i("s_title", s_title);

                if(s_title == "foo") {

                    newPendingList.remove(item);
                }


            }

            mPendingItemList = newPendingList;
        }

        }

这是onResume()

@Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        final Handler handler = new Handler(); new Thread(new Runnable() {

            @Override
            public void run() {
                while(true) {

                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            simpleAdpt.refreshMyAdapter();
                            simpleAdpt.notifyDataSetChanged();

                        }

                    });



                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

        }).start();

这仍然不起作用。

最终编辑: Ali AlNoaimi的答案确实有效,我只是错误地比较字符串。

我希望这是有道理的!谢谢

4 个答案:

答案 0 :(得分:2)

我不确定你是否理解ListView是如何运作的。 ListView是适配器中数据的直观表示,因此您绝不应尝试直接编辑,添加或删除ListView的视图,而是编辑数据,然后调用{{1}你的适配器。

然后notifyDataSetChanged()将检查适配器数据的更改并相应地刷新视图。

对于您的具体问题,这意味着您应该直接使用ListView,查找具有特定内容的项目,将其删除,然后拨打mPendingItemList

答案 1 :(得分:1)

将此方法添加到适配器:

public void refreshMyAdapter() {

    private List<Map<String, Object>> newPendingList;

    for (int i = 0; i < mPendingItemList.size(); i++) {
        Map<String, Object> item = mPendingItemList.get(i);

        if(it matches) {
            newPendingList.add(item);
        }


    }

    mPendingItemList = newPendingList;
}

并在您的主要活动中,片段

    final Handler handler = new Handler();
    new Thread(new Runnable() {

        @Override
        public void run() {
            while(true) {

                handler.post(new Runnable() {

                    @Override
                    public void run() {
                        yourPendingAdapter.refreshMyAdapter();
                        yourPendingAdapter.notifyDataSetChanged();

                    }

                });



                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }).start();

答案 2 :(得分:0)

最简单的方法是删除创建适配器时使用的ArrayList中的项目,然后在adabter上调用notifyDataSetChanged();以更新列表视图。

答案 3 :(得分:0)

有一个连贯的实现,在DataModel上保持数据处理。 将此方法添加到DataModel类:

public void clearObsoleteItems(){
    //TODO: add you implementation to clear the obsolete items from the List of items holded by the singleton class. 

}

在适配器类PendingAdapter上添加项目列表的setter:

public void setPendingItemList(List<Map<String, Object>> mPendingItemList) {
this.mPendingItemList = mPendingItemList;
notifyDataSetChanged();

}

来自活动onResume的

DataModel.getInstance().clearObsoleteItems();

mAdapter.setPendingItemList(DataModel.getInstance().getPendingItemList());