2014-07-09 4 views
3

저는 listview (이 조각은 활동 생성시 생성 된 PlaceHolderFragment 임)가 포함 된 단편 작업을하고 있습니다. ArrayAdapter를 확장하여 사용자 정의 어댑터를 만들고이 어댑터로 목록보기를 채 웁니다.ArrayAdapter의 onClickListener에서 활동을 다시로드하는 방법

하나의 중요한 점은 listview의 한 행에 두 가지 버튼이 있습니다. 첫 번째는 사용자의 상태를 변경하는 사용/사용 안함 버튼입니다 (사용자의 상태가 활성화 된 경우 비활성화, 그렇지 않으면 활성화). 두 번째는 삭제입니다. 버튼 (사용자 삭제). 그래서 어댑터의 getView() 메소드에서이 두 버튼에 대해 OnClickListener를 구현해야합니다.

버튼을 클릭하면 서버에 요청을 보내고 데이터베이스를 조작하고 (데이터베이스의 사용자 상태를 변경하거나 데이터베이스에서 사용자를 삭제합니다). 문제는 성공 버튼을 클릭하면 데이터베이스의 사용자 상태가 변경되거나 삭제 버튼을 클릭하면 사용자가 데이터베이스에서 성공적으로 삭제됩니다.

버튼을 클릭하면 상태가 변경되지 않았습니다 (즉, 사용자가 활성화되어 있으면 버튼을 비활성화하거나 사용자가 삭제 된 경우 해당 행이 화면에서 제거되어야 함). 이 조각을 손으로 다시로드해야합니다 (다른 조각으로 전환 한 다음 다시 돌아 오십시오)

질문은 어떻게하면 작업을 다시로드 할 수 있습니까? (모든 데이터를 어댑터에로드하기 위해 이미 구현했습니다. 따라서이 메서드를 onResume으로 만들면됩니다.), 또는 적어도 어떻게 새 데이터를 업데이트하기 위해 listview를 다시로드 할 수 있습니까?

: 당신이 내 코드를 게시 할 날 필요로하는 경우 : 어댑터의 데이터가 실제로 아직 서버에있는 데이터 만

주 2을 변경 변경되지 않기 때문에 notifyDataSetChanged()이 작동하지 않습니다 제발 내 코드가 길다고 생각해서 코멘트를 주시면 제 게시물을 편집 해 드리겠습니다.

감사합니다.

EDIT 1 나는 아래,이 문제를 해결 대답에 내 솔루션을 게시 한하지만 난이 안드로이드에서 매우 매우 BAD 연습이라고 말해야한다. 예를 들어이 방법으로 항목을 삭제하려면 사용자가 확인할 수 있도록 AlertDialog를 넣을 수 있지만 AlertDialog는 Activity (또는 Fragment)에만 표시 할 수 있으며 어댑터에서 표시 할 수는 없습니다. 따라서 대신 ContextMenu 또는 CustomDialog와 같은 다른 메서드를 사용해야합니다.

+0

시도한 코드를 공유 할 수 있습니까? – MTahir

+0

@MTahir : 내 문제를 살펴 줘서 고맙지 만, 이제는 아래에 게시 한 답변을 찾았습니다. –

답변

3

Google을 검색하고 다른 방법을 시도한 후 마침내 원하는 내용을 보관하는 방법을 찾았습니다. 매우 간단합니다. 나는 미래를의

public class CustomAdapter extends ArrayAdapter<YourClass> { 
    private List<YourClass> items; 
    private CustomAdapter adapter; 
    private Context context; 
    private Button button; 
    private YourClass item; 

    public CustomAdapter(Context context, List<YourClass> items) { 
     super(context, R.layout.custom_list_item, items); 
     this.items = items; 
     this.context = context; 
     this.adapter = this; //This is an important line, you need this line to keep track the adapter variable 
    } 

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

     if (v == null) { 
      LayoutInflater li = LayoutInflater.from(getContext()); 
      v = li.inflate(R.layout.custom_list_item, null); 
     } 
     item = items.get(position); 

     button = (Button) v.findViewById(R.id.button); //Find the button 
     button.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View view) { 
         //Do something inside here like update, remove your item... 
         //But the important is 
         items.remove(item); //Actually change your list of items here 
         adapter.notifyDataSetChanged(); //notify for change 
        } 
       }); 
    } 
    return v; 
} 

에 나 같은이 문제에 직면 사람 여기 내 대답을 게시 당신은 당신이 어댑터 내부의 OnClick을 구현해야하는 경우 다시로드 목록보기를 필요로 할 때 구현하는 데 필요한 모든.이 문제에 직면했을 때 나보다 더 쉽게 찾을 수 있기를 바랍니다.

+0

왜 this.notifyDataSetChanged();를 사용하지 않으시겠습니까? – Rule

+0

@Rule :이 줄을 제거하면 어댑터의 데이터가 실제로 변경되지 않습니다 items.remove (item); 그런 다음 adapter.notifyDataSetChanged()를 호출하십시오. 아무것도하지 않았다 –

+0

그것은 완벽하게 나를 위해 일하고있다 (만약이 하나를 fallowing, 먼저 코드에서 주석을 읽으십시오) – Bahu

0

귀하가 원하는대로 단추 중 하나를 클릭하면 목록 데이터를 새로 고치려는 귀하의 질문에서 이해할 수있는 사항은 무엇입니까?
이제 notifydataset을 호출하여 활동을 다시로드하는 대신 변경해야합니다. 이 경우 어댑터에 사용중인 배열을 변경해야합니다 (어레이의 항목 만 변경하지 마십시오) arraylst.get (index) .activ = true 등을 입력 한 다음 notifiydataset change .

관련 문제