2014-12-26 1 views
0

사용자 지정 어댑터와 listItemView가 구현되었습니다. 어댑터는 onlclick 리스너를 listItemView에있는 버튼으로 설정합니다. onclick 리스너는 단순히 어댑터에있는 개인 메서드를 호출하고 제거 할 항목의 위치에 전달합니다. 데이터베이스가 적절한 항목을 제거하기 때문에 위치가 정확하다는 것을 알고 있습니다. 비슷한 질문을 찾았지만 답을 나를 위해 일할 수있는 적응력을 갖추지 못했습니다. 아이디어와 생각은 크게 감사드립니다. 감사.사용자 지정 어댑터에서 전화를 걸면 항상 마지막 항목이 제거됩니다.

다음은 전체 어댑터 클래스 다음

public class FoodListAdapter extends ArrayAdapter<FoodListItem> { 

    //private 
    private int type; 

    public FoodListAdapter(Context context, ArrayList<FoodListItem> _objects) { 
     super(context, 0, _objects); 
     type = 0;  
    } 

    public FoodListAdapter(Context context, ArrayList<FoodListItem> _objects, int _type) { 
     super(context, 0, _objects); 
     type = _type;  
    } 

    @Override 
    public View getView(int position, View reusableView, ViewGroup parent) 
    { 
     //Cast the reusable view to a listAdpaterItemView 
     FoodListItemView listItemView = (FoodListItemView) reusableView; 

     //Check if the listAdapterItem is null 
     if(listItemView == null) 
     { 
      //If it is null, then create a view. 
      listItemView = FoodListItemView.inflate(parent, this, type); 
     } 

     if (type == 2) 
     { 
      Button deleteButton = (Button) listItemView.findViewById(R.id.listItemViewDeleteBTN); 
      deleteButton.setTag(new Integer(position)); 
     } 

     //Now we need to set the view to display the data. 
     listItemView.setData(getItem(position)); 

     return listItemView; 
    } 
} 

조각에 사용되는 내 코드의 일부이다. 내가 필요하다고 생각하지는 않지만, private 변수가 listAdapter 클래스에 데칼로 선언되어있다.

private void displayListForDate(Calendar _date) 
{ 
    //get the list view 
    ListView listView = (ListView) getView().findViewById(1); 
    //Clear the listview by removing the listadapter and setting it to null. 
    //listView.setAdapter(null); 

    //First we must get the items. 
    Global global = (Global) getActivity().getApplicationContext(); 
    DietSQLiteHelper database = global.getDatabase(); 

    //Create a list to hold the items we ate. This list will then be added to the listView. 
    final ArrayList<FoodListItem> consumedList; 
    //Add the items to the array. 
    consumedList = database.getConsumed(_date.getTimeInMillis()); 

    //Create an adapter to be used by the listView 
    listAdapter = new FoodListAdapter(getActivity().getBaseContext(), consumedList, 2); 

    //Add the adapter to the listView. 
    listView.setAdapter(listAdapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      consumedList.remove(position); 
      listAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 
+0

여기서 어댑터에서 데이터를 제거 하시겠습니까? – Rohit5k2

+0

deleteItem()에서 remove (item)을 호출하려고합니다.이 메서드는 adapater 클래스에 있습니다. – n01d3a

+0

'remove (item)'메소드의 코드를 게시 할 수 있습니까? – Rohit5k2

답변

0

나는 코드를 작성하고 정리했다. 이제는 작동하는 코드가있다. 정말 할당하고보기를 얻기 위해 사용하고있는 ID를 업데이트 한 것 이외의 차이점을 정확히 알지 못합니다. 누구든지 내가 겪고있는 문제의 원인을 설명 할 수 있다면 감사 할 것입니다.

다음은 목록보기를 만들고 어댑터를 할당 한 내 조각의 스 니펫입니다.

private void displayListForDate(Calendar _date) 
{ 
    //get the list view 
    ListView listView = (ListView) getView().findViewById(R.id.listView); 
    //Clear the listview by removing the listadapter and setting it to null. 
    //listView.setAdapter(null); 

    //First we must get the items. 
    Global global = (Global) getActivity().getApplicationContext(); 
    DietSQLiteHelper database = global.getDatabase(); 

    //Create a list to hold the items we ate. This list will then be added to the listView. 
    ArrayList<FoodListItem> consumedList; 
    //Add the items to the array. 
    consumedList = database.getConsumed(_date.getTimeInMillis()); 

    //Create an adapter to be used by the listView 
    listAdapter = new FoodListAdapter(getActivity().getBaseContext(), consumedList, 2); 

    //Add the adapter to the listView. 
    listView.setAdapter(listAdapter); 
} 

여기 내 어댑터 클래스입니다.

public class FoodListAdapter extends ArrayAdapter<FoodListItem> 
{ 

    //private 
    private int type; 

    public FoodListAdapter(Context context, ArrayList<FoodListItem> _objects) { 
     super(context, 0, _objects); 
     type = 0;  
    } 

    public FoodListAdapter(Context context, ArrayList<FoodListItem> _objects, int _type) { 
     super(context, 0, _objects); 
     type = _type;  
    } 

    @Override 
    public View getView(int position, View reusableView, ViewGroup parent) 
    { 
     //Cast the reusable view to a listAdpaterItemView 
     FoodListItemView listItemView = (FoodListItemView) reusableView; 

     //Check if the listAdapterItem is null 
     if(listItemView == null) 
     { 
      //If it is null, then create a view. 
      listItemView = FoodListItemView.inflate(parent, type); 
     } 

     if (type == 2) 
     { 
      Button deleteButton = (Button) listItemView.findViewById(R.id.listItemViewDeleteBTN); 
      deleteButton.setTag(new Integer(position)); 
      deleteButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Integer tag = (Integer) view.getTag(); 
        deleteItem(tag.intValue()); 
       } 
      }); 
     } 

     //Now we need to set the view to display the data. 
     listItemView.setData(getItem(position)); 

     return listItemView; 
    } 

    private void deleteItem(int position) 
    { 
     FoodListItem item = getItem(position); 
     Global global = (Global) getContext().getApplicationContext(); 

     DietSQLiteHelper database = global.getDatabase(); 
     database.removeConsumed(item.getID()); 

     remove(getItem(position)); 
    } 
} 
0

FoodListItem의 "equals"메소드를 구현하지 않은 경우 구현하십시오.

+0

이것은 구현되었으며, 인수의 ID가 항목 자체와 일치 할 때 디버거를 통해 참이 반환되는지 확인했습니다. – n01d3a

0

나는 귀하의 경우 기본 데이터 (ArrayList<FoodItems>)를 업데이트한다고 제안합니다. 단지 메서드를 호출,

private List<FoodListItem> myList = new ArrayList<FoodListItem>(); 

public FoodListAdapter(Context context, List<FoodListItem> myList) { 
    super(context, 0, myList); 
    type = 0; 
    this.myList = myList; 
} 

public FoodListAdapter(Context context, List<FoodListItem> myList, int _type) { 
    super(context, 0, myList); 
    type = _type; 
    this.myList = myList;  
} 

// Also update your getView() method to use myList! 
@Override 
public View getView(int position, View reusableView, ViewGroup parent) 
{ 
    ... 
    listItemView.setData(myList.get(position)); 

public void removeItem(int positio){ 
    if(myList != null){ 
     myList.remove(position); 
    } 
} 

그리고 수업 시간에, 당신은 어댑터 (활동/조각)을 만드는 : 어댑터에서

이 간단한 방법 변경합니다. 당신이 그것을 차단하고 있기 때문에

// Update the underlying ArrayAdapter 
adapter.removeItem(position); 
// Notify the adapter, the data has changed 
adapter.notifyDataSetChanged(); 

또한, 당신은 UI 스레드에서 귀하의 SQLiteDatabase에 열린 연결을 야해. 당신은 절대 알지 못한다. 얼마나 빨리 디스크를 읽을 수있을 것인가. 시간이 너무 오래 걸리면 사용자가 응용 프로그램이 멈췄다 고 생각할 수 있습니다. 따라서 사용자가 원하지 않는 응용 프로그램이 멈 춥니 다. 내가 AsyncTask을 사용하는 것이 좋습니다, 당신은 examples을 많이 찾을 수 있습니다.

+0

어댑터가 어댑터를 제공 할 때 직접 목록을 구현하지 않기를 바랬습니다. 또한 일부 메소드를 오버라이드해야합니다. 또한 어댑터의 버튼에 clickListener를 추가 할 때 어떻게해야합니까? 목록의 모든 행을 보면 삭제 버튼이 있습니다. AsyncTask에 대한 귀하의 권고를 살펴 보겠습니다.하지만 데이터가 업데이트 될 때까지 UI를 계속 사용하지 않으려합니다. 어쩌면 대기 화면으로 충분할 것입니다. – n01d3a

+0

제안한 변경 사항을 적용했지만 여전히 동일한 문제가 있습니다. 나는 뭔가를 간과해야합니다. – n01d3a

+0

@ n01d3a ListView에 Listener를 설정하고 ArrayList에서 항목을 제거해야합니다. 그런 다음 어댑터에 알리면 올바르게 새로 고쳐야합니다. 즉,이 코드는 어댑터가 아닌 Activity/Fragment에서 수행합니다. 이것을보십시오 : http://stackoverflow.com/questions/18444671/remove-item-in-arrayadapterstring-in-listview –