我有一个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
的答案确实有效,我只是错误地比较字符串。
我希望这是有道理的!谢谢
答案 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());