2014-02-12 4 views
1

나는 ArrayAdapter과 함께 나의 목록보기에 대해 ArrayList<Color> colorList을 가지고 있습니다. 내 POJO는 다음과 같습니다 :반복하지 않고 목록보기에서 항목을 삭제하는 방법

public class Color { 
int id; 
String name; 
//getter setter 
} 

모든 것이 서버에서 가져옵니다. 따라서 각 색상 객체의 id은 DB 테이블의 id과 일치합니다.

ArrayAdapter'sgetView 데이터베이스에서 id으로 태그를 설정합니다. 위의 코드에서

holder.imageButton.setTag(item.getId()); //color id from database 
    holder.imageButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      int id = (Integer) v.getTag(); 
      new DeleteColor(id).execute(); 
     } 
    }); 

나는 보낸다 클릭 한 항목의 id

내 목록보기에서 항목을 제거하는 쉬운 방법은 무엇입니까 삭제

의 서버에?

는 내가 지금하고 있어요 것은 :

class DeleteColor extends AsyncTask<String, String, String> { 

    int id; 
    public DeleteColor (int id) { 
     this.id = id; 
    } 

    @Override 
    protected String doInBackground (String ... args) { 
     MyManager.INSTANCE.getService().deleteColor(id, new Callback<Integer>() { 
      @Override 
      public void success(Integer id, Response response) { 
       //loop through the colorlist to find which one to remove 
       for (int i = 0; i < colorList.size(); i++) { 
        Color c = colorList.get(i); 
        if (c.getId() == id) { 
         colorList.remove(c); 
         adapter.notifyDataSetChanged(); 
         break; 
        } 
       } 
      } 
      @Override 
      public void failure(RetrofitError retrofitError) { 

      } 
     }); 
     return ""; 
    } 
} 

당신이 볼 수 있듯이, 나는 그것을 제거 그때 제거하려는 id이있는 하나를 찾기 위해 전체 colorList 통해 반복하고 있어요. 이를 달성하기위한 좋은 접근 방법입니까?

질문

내가 삭제해야 할 일을 찾기 위해 전체 colorList 통해 반복 피할 수있는 방법.

+0

'onPostExecute()'메소드에서'notifyDataSetChanged()'를 호출하십시오. – Houcine

+0

물론 그렇지만 전체 목록을 반복적으로 조사하여 삭제할 항목을 찾는 문제는 해결되지 않습니다. 내가 지금 가지고있는 해결책은 잘 작동하고있다.하지만 당신 말이 맞아요.'notifyDataSetChanged()'를'onPostExecute()'로 옮길 수 있습니다. – Anthony

+0

J0hj0h와 사운드 개념은 기본적으로 여기에 있습니다. indexOf()는 아마 가독성 측면에서 가장 쉬운 방법 일 것입니다.하지만 결정은 여러분이 결정합니다. indexOf() 소스는 기본적으로 수행중인 작업과 null 확인 작업을 수행합니다. List와 관련된 문제는 remove가 O (n) 작업이라는 것입니다. O (n)을 이기기 위해 제거가 필요하다면지도에 색상을 저장할 수 있지만 전체 코드를 보지 않아도 다른 합병증을 일으킬 지 확실하지 않습니다. 솔직히, 수백만 가지 색상이 부족하지만, O (n)은 좋을 것입니다. –

답변

3

목록에서 제거 할 개체의 ID가 있습니다. 해당 id를 사용하여 객체를 가져온 다음 ArrayList 메소드 indexOf(Object object)을 사용하여 목록에서 객체의 색인을 찾아서 제거합니다.

1

기술적으로 목록의 항목에 직접 액세스 할 수있는 방법이 없습니다.
학교에서 우리는 자바로 스스로 목록을 만들었고 서로 연결된 여러 항목으로 구성되었습니다. 그러나 첫 번째는 두 번째에만 연결되었으며 세 번째는 연결되었습니다. 따라서 상단에서 시작하지 않고도 두 번째 장소의 객체에 액세스 할 수 없습니다. 목록을 반복해야하는 항목에 액세스하려면

방금 ​​Sound Conception의 대답을 읽었으며 indexOf(Object) -method 자체가 전체 목록을 반복한다고 확신합니다 (Java 개발자가 실제로 할 수있는 마술을하지 않았다면 ;;) 저는 전문가가 아니며 그 방법의 코드를 조사하지 않았다). 그러나 아마도 수동 루핑이 가장 효율적인 방법 일 것입니다.

나는 생각하지 않는다. 실행 시간에는 실제적인 차이가있다. 따라서 Sound Conception의 방법을 사용하여 코드를 단순하게 유지하고자 할 수 있습니다. 그것은 전적으로 당신에게 달렸습니다! 당신이보기에 태그와 같은 항목의 위치를 ​​설정하면

0

당신에게 위치를 줄 것이다)

그런 v.getId (..... 또 다른 방법 하나가 클릭하면 바로 목록에서 제거 할 수 있습니다 as arraylist.remove (positionclicked);