如何删除列表视图中的项目(当列表由共享preferences填充 [英] How to delete list view items (when list is populated by SharedPreferences
问题描述
我已经成功地被共享preferences填充的列表视图。
公共类FavouritesActivity延伸活动{ArrayAdapter<串GT;适配器;
清单<串GT;清单;
私人的ListView LV;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_my_favourites); LV =(ListView控件)findViewById(R.id.My_Favourites); 共享preferences preferences = this.getShared preferences(我的preferences
Context.MODE_PRIVATE);
ArrayList的<串GT;表=新的ArrayList<串GT;();
地图<字符串,> prefsMap = preferences.getAll();
对于(Map.Entry的<弦乐,>进入:prefsMap.entrySet()){
List.add(entry.getValue()的toString());
}
ArrayAdapter<串GT; arrayAdapter =新ArrayAdapter<串GT;(这一点,
android.R.layout.simple_list_item_1,列表); lv.setAdapter(arrayAdapter);
这个伟大的工程,但现在我想从列表中删除的项目。
lv.setOnItemLongClickListener(新OnItemLongClickListener(){ @覆盖
公共布尔onItemLongClick(适配器视图<>为arg0,ARG1查看,
INT位置,长ARG3){
removeItemFromList(位置);
返回true;
}
});
}保护无效removeItemFromList(INT位置){
最终诠释deletePosition =位置;
AlertDialog.Builder警报=新AlertDialog.Builder(
FavouritesActivity.this); alert.setTitle(删除);
alert.setMessage(你确定要删除这个项目吗?);
alert.setPositiveButton(是,新DialogInterface.OnClickListener(){ @覆盖
公共无效的onClick(DialogInterface对话,诠释它){
List.remove(deletePosition);
adapter.notifyDataSetChanged();
adapter.notifyDataSetInvalidated();
}
});
alert.setNegativeButton(CANCEL,新DialogInterface.OnClickListener(){ @覆盖
公共无效的onClick(DialogInterface对话,诠释它){
dialog.dismiss();
}
});
alert.show();
}
不幸的是这部分不起作用。该AlertView显示器,但选择确认崩溃的应用程序。
我有一种感觉,它是值得做的阵列适配器,但我在努力发现它。
任何人都可以点我在正确的方向?
崩溃日志:
10月1日至10日:35:45.950:E / AndroidRuntime(1370):致命异常:主要
10月1日至10日:35:45.950:E / AndroidRuntime(1370):工艺:com.LifeSchematics.msg,PID:1370
10月1日至10日:35:45.950:E / AndroidRuntime(1370):显示java.lang.NullPointerException
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在com.LifeSchematics.msg.FavouritesActivity $ 2.onClick(FavouritesActivity.java:78)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在com.android.internal.app.AlertController $ ButtonHandler.handleMessage(AlertController.java:166)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在android.os.Handler.dispatchMessage(Handler.java:102)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在android.os.Looper.loop(Looper.java:136)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在android.app.ActivityThread.main(ActivityThread.java:5017)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在java.lang.reflect.Method.invokeNative(本机方法)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在java.lang.reflect.Method.invoke(Method.java:515)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10月1日至10日:35:45.950:E / AndroidRuntime(1370):在dalvik.system.NativeStart.main(本机方法)
试试这个..
我猜你得到的 NPE 因为你无法初始化两个列表<串GT;清单;
和 ArrayAdapter<串GT;适配器;
只需更换它。
共享preferences preferences = this.getShared preferences(我的preferences,Context.MODE_PRIVATE); //这里更正
表=新的ArrayList<串GT;();
地图<字符串,> prefsMap = preferences.getAll();
对于(Map.Entry的<弦乐,>进入:prefsMap.entrySet()){
List.add(entry.getValue()的toString());
} //这里更正
arrayAdapter =新ArrayAdapter<串GT;(这一点,android.R.layout.simple_list_item_1,列表); lv.setAdapter(arrayAdapter);
I have a list view successfully being populated by SharedPreferences.
public class FavouritesActivity extends Activity {
ArrayAdapter<String> adapter;
List<String> List;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_favourites);
lv = (ListView) findViewById(R.id.My_Favourites);
SharedPreferences preferences = this.getSharedPreferences("MyPreferences",
Context.MODE_PRIVATE);
ArrayList<String> List = new ArrayList<String>();
Map<String, ?> prefsMap = preferences.getAll();
for (Map.Entry<String, ?> entry: prefsMap.entrySet()) {
List.add(entry.getValue().toString());
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, List);
lv.setAdapter(arrayAdapter);
This works great, but now I want to delete items from the list.
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
removeItemFromList(position);
return true;
}
});
}
protected void removeItemFromList(int position) {
final int deletePosition = position;
AlertDialog.Builder alert = new AlertDialog.Builder(
FavouritesActivity.this);
alert.setTitle("Delete");
alert.setMessage("Are you sure you want delete this item?");
alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
List.remove(deletePosition);
adapter.notifyDataSetChanged();
adapter.notifyDataSetInvalidated();
}
});
alert.setNegativeButton("CANCEL",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alert.show();
}
Unfortunately this section does not work. The AlertView displays, but selecting confirm crashes the app.
I have a feeling it is something to do with the array adapter, but I'm struggling to spot it.
Can anyone point me in the right direction?
CRASH LOG:
01-10 10:35:45.950: E/AndroidRuntime(1370): FATAL EXCEPTION: main
01-10 10:35:45.950: E/AndroidRuntime(1370): Process: com.LifeSchematics.msg, PID: 1370
01-10 10:35:45.950: E/AndroidRuntime(1370): java.lang.NullPointerException
01-10 10:35:45.950: E/AndroidRuntime(1370): at com.LifeSchematics.msg.FavouritesActivity$2.onClick(FavouritesActivity.java:78)
01-10 10:35:45.950: E/AndroidRuntime(1370): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
01-10 10:35:45.950: E/AndroidRuntime(1370): at android.os.Handler.dispatchMessage(Handler.java:102)
01-10 10:35:45.950: E/AndroidRuntime(1370): at android.os.Looper.loop(Looper.java:136)
01-10 10:35:45.950: E/AndroidRuntime(1370): at android.app.ActivityThread.main(ActivityThread.java:5017)
01-10 10:35:45.950: E/AndroidRuntime(1370): at java.lang.reflect.Method.invokeNative(Native Method)
01-10 10:35:45.950: E/AndroidRuntime(1370): at java.lang.reflect.Method.invoke(Method.java:515)
01-10 10:35:45.950: E/AndroidRuntime(1370): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-10 10:35:45.950: E/AndroidRuntime(1370): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-10 10:35:45.950: E/AndroidRuntime(1370): at dalvik.system.NativeStart.main(Native Method)
Try this..
I guess you getting NPE because your not initialize both List<String> List;
and ArrayAdapter<String> adapter;
Just replace it..
SharedPreferences preferences = this.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);
//correction here
List = new ArrayList<String>();
Map<String, ?> prefsMap = preferences.getAll();
for (Map.Entry<String, ?> entry: prefsMap.entrySet()) {
List.add(entry.getValue().toString());
}
// correction here
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, List);
lv.setAdapter(arrayAdapter);
这篇关于如何删除列表视图中的项目(当列表由共享preferences填充的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!