jeudi 29 mai 2014

Java - supprimer ou modifier les éléments d'arraylist - Stack Overflow


I have an arraylist where having a long click on an element, It shows a context menu where I can remove or edit the selected item of the arraylist.


The doubt that I have is, how I define which item I'm selecting, to edit or remove it?


These are the methods referred to the context menu. Is the first time I'm using this menu and I haven't tested yet the functionality, so these methods may be wrong.


@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

AdapterView.AdapterContextMenuInfo info;
info = (AdapterView.AdapterContextMenuInfo) menuInfo;

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit_travel:

return true;
case R.id.delete_travel:

return true;
default:
return super.onContextItemSelected(item);
}
}

As I said, I think that is missing the way to determine which element of the arraylist I want to edit or delete, but I don't know how to define this


UPDATE -- added code


public class TravelListActivity extends ListActivity {

private static final int REQUEST_CODE_CREATE_TRAVEL = 0;
private TravelAdapter adapter;

private class TravelAdapter extends ArrayAdapter<TravelInfo>{

private final Context context;
private final ArrayList<TravelInfo> travels;
private static final int RESOURCE = android.R.layout.simple_list_item_2;

public TravelAdapter(Context context, ArrayList<TravelInfo> travels) {
super(context, RESOURCE, travels);

this.context = context;
this.travels = travels;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

LinearLayout view;
ViewHolder holder;

if (convertView == null){
view = new LinearLayout(context);

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(RESOURCE, view, true);

holder = new ViewHolder();
holder.text1 = (TextView) view.findViewById(android.R.id.text1);
holder.text2 = (TextView) view.findViewById(android.R.id.text2);
view.setTag(holder);

} else {
view = (LinearLayout) convertView;
holder = (ViewHolder) view.getTag();
}

TravelInfo info = travels.get(position);
holder.text1.setText(info.getCity() + " (" + info.getCountry() + ")");
holder.text2.setText(getResources().getString(R.string.year) + " " + info.getYear());

return view;
}

}

static class ViewHolder {
TextView text1;
TextView text2;
}


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

registerForContextMenu(getListView());



You can get the item which is long pressed by the following lines:


TravelInfo itemSelected = adapter.getItem(info.position);

Example:


@Override
public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
TravelInfo itemSelected = adapter.getItem(info.position);
switch (item.getItemId()) {
case R.id.edit_travel:

return true;
case R.id.delete_travel:

return true;
default:
return super.onContextItemSelected(item);
}
}

Note: For this to work (1) you should have initialized adapter in the onCreate (2) set the list adapter by calling setAdapter(adapter)




you can get the position of selected row of listview:


 @Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();

switch (item.getItemId()) {
case R.id.edit_travel:
Toast.makeText(getBaseContext(), "edit: "+info.position, Toast.LENGTH_SHORT).show();
return true;
case R.id.delete_travel:
Toast.makeText(getBaseContext(), "delete: "+info.position, Toast.LENGTH_SHORT).show();
return true;
}
return false;
}

After getting position remove / Update it from your Arraylist at that position . Now, call notifyDataSetChanged :: youradapter.notifyDataSetChanged();



I have an arraylist where having a long click on an element, It shows a context menu where I can remove or edit the selected item of the arraylist.


The doubt that I have is, how I define which item I'm selecting, to edit or remove it?


These are the methods referred to the context menu. Is the first time I'm using this menu and I haven't tested yet the functionality, so these methods may be wrong.


@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);

AdapterView.AdapterContextMenuInfo info;
info = (AdapterView.AdapterContextMenuInfo) menuInfo;

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit_travel:

return true;
case R.id.delete_travel:

return true;
default:
return super.onContextItemSelected(item);
}
}

As I said, I think that is missing the way to determine which element of the arraylist I want to edit or delete, but I don't know how to define this


UPDATE -- added code


public class TravelListActivity extends ListActivity {

private static final int REQUEST_CODE_CREATE_TRAVEL = 0;
private TravelAdapter adapter;

private class TravelAdapter extends ArrayAdapter<TravelInfo>{

private final Context context;
private final ArrayList<TravelInfo> travels;
private static final int RESOURCE = android.R.layout.simple_list_item_2;

public TravelAdapter(Context context, ArrayList<TravelInfo> travels) {
super(context, RESOURCE, travels);

this.context = context;
this.travels = travels;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

LinearLayout view;
ViewHolder holder;

if (convertView == null){
view = new LinearLayout(context);

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(RESOURCE, view, true);

holder = new ViewHolder();
holder.text1 = (TextView) view.findViewById(android.R.id.text1);
holder.text2 = (TextView) view.findViewById(android.R.id.text2);
view.setTag(holder);

} else {
view = (LinearLayout) convertView;
holder = (ViewHolder) view.getTag();
}

TravelInfo info = travels.get(position);
holder.text1.setText(info.getCity() + " (" + info.getCountry() + ")");
holder.text2.setText(getResources().getString(R.string.year) + " " + info.getYear());

return view;
}

}

static class ViewHolder {
TextView text1;
TextView text2;
}


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

registerForContextMenu(getListView());


You can get the item which is long pressed by the following lines:


TravelInfo itemSelected = adapter.getItem(info.position);

Example:


@Override
public boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
TravelInfo itemSelected = adapter.getItem(info.position);
switch (item.getItemId()) {
case R.id.edit_travel:

return true;
case R.id.delete_travel:

return true;
default:
return super.onContextItemSelected(item);
}
}

Note: For this to work (1) you should have initialized adapter in the onCreate (2) set the list adapter by calling setAdapter(adapter)



you can get the position of selected row of listview:


 @Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();

switch (item.getItemId()) {
case R.id.edit_travel:
Toast.makeText(getBaseContext(), "edit: "+info.position, Toast.LENGTH_SHORT).show();
return true;
case R.id.delete_travel:
Toast.makeText(getBaseContext(), "delete: "+info.position, Toast.LENGTH_SHORT).show();
return true;
}
return false;
}

After getting position remove / Update it from your Arraylist at that position . Now, call notifyDataSetChanged :: youradapter.notifyDataSetChanged();


0 commentaires:

Enregistrer un commentaire