Reputation: 127
this question is is similar to this - Android - Listview delete item and Refresh .
I cant refresh my adapter with :
adapter.notifyDataSetChanged();
I tried:
adapter.remove(adapter.getItem(pos));
but without success, just one time (weird...).
there is another answer there:
Call that Activity once again Using Intent
sombody can give me the exact code for this (or for the adapter/cursor) ?
I am trying this for a couple of hours without success.
my full code:
protected void onCreate (Bundle SavedInstanceState) {
super.onCreate(SavedInstanceState);
setContentView(R.layout.personalmessageview);
headtitle= getIntent().getExtras().getString("head");
setTitle(headtitle);
personalresults = getIntent().getExtras().getStringArrayList("personalres");
personalresultswithtime = getIntent().getExtras().getStringArrayList("personalrestime");
// setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,personalresults));
ListView list = (ListView)findViewById(R.id.listview_personal);
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, personalresults);
list.setAdapter(adapter);
registerForContextMenu(list);
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
String time = personalresultswithtime.get(pos).toString();
Show_Alert_box(v.getContext(),"Please select action.",time,pos);
return true;
}
});
public void Show_Alert_box(Context context, String message,String time,int position) final String timestamp = time;
final int pos = position;
final AlertDialog alertDialog = new AlertDialog.Builder(context).create();
alertDialog.setTitle(getString(R.string.app_name));
alertDialog.setButton("Delete", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
try
{
db = databaseHelper.getWritableDatabase();
db.delete("messages","timestamp" + "=?", new String[] { timestamp });
Log.d("DB"," delete! ");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(PersonalMessageView.this, android.R.layout.simple_list_item_1, personalresults);
adapter.remove(adapter.getItem(pos)); //not working t all! why ?
list.notify();
list.invalidate();
personalresults.remove(pos);
personalresultswithtime.remove(pos);
adapter.notifyDataSetChanged();
db.close();
}
catch(Exception e)
{
}
} });
alertDialog.setButton2("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
} });
alertDialog.setMessage(message);
alertDialog.show();
}
Upvotes: 8
Views: 36687
Reputation: 21
Your issue is that you are creating a new adapter object and calling .notifyDataSetChanged() on that, rather than on the adapter that you have attached to your list view.
Upvotes: 0
Reputation: 567
Try this
Intent intent= getIntent();
finish();
startActivity(intent);
Upvotes: -3
Reputation: 1256
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
int position = info.position;
favouriteReportList d;
d= array_list.get(position);
switch (item.getItemId()) {
case R.id.connect:
return true;
case R.id.mark:
return true;
case R.id.delete:
myFavReport = new DBhandlerReport(this);
myFavReport.deleteMyFavReport(d.getReportName(), d.getPathName(), myUrl);
myFavReport.close();
// arrarAdapter is an object of your class.
arrayAdapter.remove(arrayAdapter.getItem(info.position));
arrayAdapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
Upvotes: 0
Reputation: 359
You probably got it solved but just in case anyone else has the same Problem, here is my Solution:
ArrayAdapter<String> myAdapter = (ArrayAdapter<String>)getListView().getAdapter();
myAdapter.remove(myAdapter.getItem(info.position));
myAdapter.notifyDataSetChanged();
The Problem was that you did not have the Adapter of your List.
Upvotes: 7
Reputation: 277
you have to update changes in your DB then you update your arraylist (with a requery or something like since it's deprecated) then you have to call adapter.notifyDataSetChanged();
Upvotes: 2
Reputation: 358
public class Listview_cls extends Activity implements OnItemClickListener{
ListView lv;
String items[]= {"Kolkata","Delhi","Mumbai","Pune"};
ArrayAdapter adp;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
arr = new ArrayList();
lv = (ListView) findViewById (R.id.ListView01);
for(int i=0; i<items.length; i++)
{
arr.add(items[i]);
}
adp = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arr);
lv.setAdapter(adp);
lv.setOnItemClickListener(this);
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)
{
adp.remove(adp.getItem(arg2));
adp.notifyDataSetChanged();
}
}
Upvotes: 0
Reputation: 155
make function to bind your adapter with Listview and just call again that function while deletion completed so that Listview filled again and you get refreshed list.
Are u using database ?
Upvotes: 2
Reputation: 4503
try using listview.invalidateViews();
after adapter.remove(adapter.getItem(pos));
Upvotes: 2
Reputation: 11230
Invalidate the List View after the data change, inside your ListActivity use the following lines when data is changed
getListView().invalidate();
Upvotes: 3