2015-11-27 2 views
-2

Привета я пытаюсь удалить элемент из моей ListView может удалить элемент из моей БД, но мой адаптер не получает обновленный я прилагаю код below`ListView адаптер не обновляется после удаления элемента

public class SavedPolygonFragment extends android.support.v4.app.Fragment implements RefreshListener { 
private static String LOG_TAG = SavedPolygonFragment.class.getName(); 

private String message = "No message"; 
private ListView   shapeList; 
private TextView   textView; 
private Button   startMainBtn; 
private SavedShapeAdapter savedShapeAdapter; 
private long    shapeId; 
private float    scaleFactor; 
private List<Shape> savedShapes = new ArrayList<>(); 
private StartDrawingListener startListener; 
private DeleteShapesDialog deleteDialog; 

public SavedPolygonFragment() { 

} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    startListener = (StartDrawingListener) activity; 
} 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_one, container, false); 

    savedShapes = getArguments().getParcelableArrayList("shapes"); 
    AssetLog.verbose(LOG_TAG, "savedshapes.size " + savedShapes.size()); 
    shapeList = (ListView) view.findViewById(R.id.shapeList); 
    textView = (TextView) view.findViewById(R.id.polygonTitle); 
    startMainBtn = (Button) view.findViewById(R.id.gotoMain); 

    startMainBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startListener.startMainReceived(); 
     } 
    }); 

    if (!savedShapes.isEmpty() && !savedShapes.equals(null) && savedShapes.size() != 0) { 
     textView.setText("Polygons"); 
     shapeList.setVisibility(View.VISIBLE); 
     startMainBtn.setVisibility(View.GONE); 


     if (savedShapeAdapter != null) { 
      savedShapeAdapter.notifyDataSetChanged(); 
     } else { 

      savedShapeAdapter = new SavedShapeAdapter(savedShapes, getActivity()); 
      shapeList.setAdapter(savedShapeAdapter); 

      shapeList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
        MainActivity_.intent(getActivity()) 
          .savedProjectId(ProjectShapesActivity.projId) 
          .scaleFactor(ProjectShapesActivity.scaleFactor) 
          .shapeId(((Shape) view.getTag()).getShapeId()) 
          .lineId(-1) 
          .pointId(-1) 
          .start(); 
       } 
      }); 


     } 
    } 
    else{ 
     shapeList.setVisibility(View.GONE); 
     startMainBtn.setVisibility(View.VISIBLE); 

     textView.setText("Sorry no shapes are saved"); 
    } 

    return view; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    registerForContextMenu(shapeList); 
} 

@Override 
public void onRefreshPressed() { 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, view, menuInfo); 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; 
    shapeId = info.id; 
    menu.add(Menu.NONE, R.id.deleteShapes, Menu.NONE, "Delete"); 
    menu.add(Menu.NONE, R.id.editShapes, Menu.NONE, "Edit"); 

} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()){ 
     case R.id.refresh: 
      return false; 

     case R.id.deleteShapes: 
      if(deleteDialog == null){ 
       Bundle bundle = new Bundle(); 
       bundle.putString("SHAPE", "SHAPE"); 
       bundle.putLong("shapeId", shapeId); 
       deleteDialog = new DeleteShapesDialog(); 
       deleteDialog.setArguments(bundle); 
       deleteDialog.show(getActivity().getFragmentManager().beginTransaction(), "showDeleteDialog"); 
      } 
      return true; 
     case R.id.editShapes: 
      return true; 

    } 
    return super.onContextItemSelected(item); 
} 


public void onDataChanged(long shapeid) { 

    Shape shape; 
    for (int i = 0; i <savedShapes.size() ; i++) { 
     shape = savedShapes.get(i); 
     if(shape.getShapeId() == shapeid){ 
      savedShapes.remove(i); 
      shapeList.removeViewAt(i); 
      shapeList.invalidate(); 
      savedShapeAdapter.notifyDataSetChanged(); 
      break; 
     } 
    } 
} 

} `

Теперь, когда пользователь выбирает да из deleteDialog я написал функцию обратного вызова для моей деятельности и в соответствующих методах это то, что я делаю

SavedPolygonFragment polygonFragment = new SavedPolygonFragment(); 
polygonFragment.onDataChanged(shapeId); 

Может кто-нибудь показать мне, что случилось

///// EDIT 1

public void onDataChanged(long shapeid) { 

    savedShapeAdapter.removeItemById(shapeid); 

} 

и мой адаптер

public void removeItemById(long itemId){ 
    for(int i =0; i< shapeList.size() ; i++){ 
     if(shapeList.get(i).getShapeId() == itemId){ 
      shapeList.remove(i); 
     } 
    } 
    notifyDataSetChanged(); 
} 

ответ

1

могу удалить элемент из моей БД, но мой адаптер не получает обновлено

Проблема вызвана:

savedShapes.remove(i); 

линии.

В настоящее время удаляется элемент из ArrayList, который находится в классе SavedPolygonFragment, а не из ArrayList, который используется адаптером для заполнения ListView.

Использование существующего подхода попробовать этот способ будет работать, установив новый адаптер каждый раз:

 if(shape.getShapeId() == shapeid){ 
      savedShapes.remove(i); 
      savedShapeAdapter = new SavedShapeAdapter(savedShapes, getActivity()); 
      shapeList.setAdapter(savedShapeAdapter); 
      savedShapeAdapter.notifyDataSetChanged(); 
      break; 
     } 

Но это не оптимизировать решение создать и установить новый объект адаптер каждый раз, когда-нужно обновить ListView.

правый подход создать метод в SavedShapeAdapter класса для удаления элемента для ArrayList, который используется адаптером, а затем вызвать его внутри onDataChanged метода:

public void deleteRowItem(int index){ 
    this.savedShapes.remove(index); 
    this..notifyDataSetChanged(); 
} 

Теперь называют deleteRowItem, когда хотите удалить элемент строки из ListView:

if(shape.getShapeId() == shapeid){ 
    savedShapeAdapter.deleteRowItem(i); 
    break; 
} 
+0

Я пробовал, как и сказал, но даю мне NullPointerException при сохраненииShapeAdapter.removeItemById (shapeid) ;. – elsa

+0

@elsa: пожалуйста, покажите обновленный код –

+0

Я использовал точку останова на этой строке, она говорит, что savedShapeAdapter = null – elsa

Смежные вопросы