2013-02-27 2 views
0

좋아, 그래서 주위에 검색 한 적이 있지만 조금 대답을 얻을 수없는 것. 이것은 가까운,하지만 그것은 목록의 마지막 항목을 제거하고 마지막 값을 제거하면 충돌합니다. 목록의 내용을 기반으로 작업을 수행 한 다음 목록에서 해당 행을 제거하기 만하면됩니다. 고맙습니다!사용자 지정 목록보기에서 행 제거 안드로이드

public class CitrusListAdapter extends ArrayAdapter<CitrusList> 
{ 

//Globals 
Context context; 
int layoutResourceId; 
ArrayList<CitrusList> data = null; 

//Create the list item row 
public CitrusListAdapter(Context context, int layoutResourceId, ArrayList<CitrusList> listItems) 
{ 
    super(context, layoutResourceId, listItems); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = listItems; 
} 

//Expand and place items for List View onto calling page in ListView 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    CitrusListHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new CitrusListHolder(); 

     //holder.txtTitle = (TextView)row.findViewById(R.id.CitrusListTitle); 
     holder.colorSpinner = (Spinner)row.findViewById(R.id.color_spinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getContext(), 
       R.array.colors_array, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     holder.colorSpinner.setAdapter(adapter); 

     holder.textureSpinner = (Spinner)row.findViewById(R.id.texture_spinner); 
     ArrayAdapter<CharSequence> texture_adapter = ArrayAdapter.createFromResource(getContext(), 
       R.array.texture_array, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     holder.textureSpinner.setAdapter(texture_adapter); 

     holder.soliditySpinner = (Spinner)row.findViewById(R.id.solidity_spinner); 
     ArrayAdapter<CharSequence> solidity_adapter = ArrayAdapter.createFromResource(getContext(), 
       R.array.solidity_array, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     holder.soliditySpinner.setAdapter(solidity_adapter); 

     Button rateButton = (Button) row.findViewById(R.id.rate_button); 
     rateButton.setTag(position); 
     rateButton.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Integer index = (Integer) v.getTag(); 
       data.remove(index.intValue()); 
       notifyDataSetChanged(); 
      } 
     }); 

     row.setTag(holder); 
    } 
    else 
    { 
     holder = (CitrusListHolder)row.getTag(); 
    } 

    CitrusList SingleLine = data.get(position); 
    //holder.txtTitle.setText(SingleLine.title); 
    return row; 
} 

//Stores the values of the items in the list view 
static class CitrusListHolder 
{ 
    //TextView txtTitle; 
    Spinner colorSpinner; 
    Spinner textureSpinner; 
    Spinner soliditySpinner; 
} 
} 
+0

어떻게 배열에서 데이터를 제거하는 방법은 무엇입니까? –

+0

'정수'를 'Button'에 태그로 설정하고 있습니까? –

답변

2

나는 당신이 remove() 방법을 사용하여 배열 목록에서 항목을 제거하고 어댑터의 notifyDataSetChanged() 메서드를 호출 할 수있는이

rateButton.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      int index = Integer.parseInt(v.getTag().toString()) 
      data.remove(index); 
      notifyDataSetChanged(); 
     } 
    }); 
+0

이 세트에는 동일한 문제가 없습니다. 그래도 감사합니다. –

+0

@ Jignesh Ansodariya +1 감사합니다 (getView 메소드에서 구성 요소를 추가하는 동안 태그로 위치를 설정해야 함) – Amith

5

을 시도한다고 생각합니다.

+0

OP가 항목을 제거하고'notifyDataSetChanged()'를'onClick() Button' –

+0

당신이 말하는 것이 내 코드에있는 것과 어떻게 다른지 잘 모르겠습니다. 당신은 정교 할 수 있습니까? –

+0

다른 사람이 찾고 있습니다. http://stackoverflow.com/questions/26373402/how-do-i-roll-out-this-view-in-my-android-application과 비슷한 레이아웃을위한 맞춤 어댑터를 작성했으며 비슷한 문제가있었습니다. 내 리스너에서 삭제 된 비동기 호출이 성공적으로 반환 된 후 다음 코드'comments.remove (position);'및'notifyDataSetChanged();'를 사용했습니다. 내 리스너는 내 사용자 정의 어댑터의 getView()에서 구현되었으며 디자인에서는'comments'가'BaseList '서브 클래스에'ArrayList >'으로로드 된'ListView'입니다. – Sonny

1

ListView에서 행을 제거하려면 ListView를 제어하는 ​​어댑터가 보유한 데이터를 수정해야합니다. 어댑터가 ArrayAdapter 인 경우 ArrayAdapter에서 remove()으로 전화하여 삭제해야하는 항목의 위치를 ​​지정하십시오. 그런 다음 notifyDataSetChanged()을 사용하여 어댑터에 알립니다. 어댑터가 ListView를 새로 고치고 잘못된 행이 삭제됩니다.

코드에서 현재 항목의 위치를보기 소유자에 저장하지 않습니다. 이 그것을 변경 :

static class CitrusListHolder 
{ 
    //TextView txtTitle; 
    Spinner colorSpinner; 
    Spinner textureSpinner; 
    Spinner soliditySpinner; 
    int currentPosition; 
} 

그런 다음 작업을해야 홀더

Button rateButton = (Button) row.findViewById(R.id.rate_button); 
     rateButton.setTag(position); //delete this line 
     holder.currentPosition = position; //storing current position in holder 
     rateButton.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       CitrusListHolder currHolder = (CitrusListHolder) v.getParent().getTag(); //get button's parent which is the row 
       data.remove(currHolder.currentPosition); //get the stored position and remove the corresponding row 
       notifyDataSetChanged(); 
      } 
     }); 

의 위치를 ​​설정합니다.

+0

Hrm. 홀더에 currentPosition을 추가하고 rateButton.setTag 행을 제거하고 currentPosition = position을 설정하고 onClick 내에서 index.currentPosition을 시도했지만 currentPosition을 확인할 수 없거나 필드가 아닙니다."holder.currentPosition (전 글로벌 소유자)을 사용했을 때 선택한 항목이 아닌 목록의 마지막 행만 제거하는 것과 동일한 작업을 수행합니다. –

+0

답변을 편집했습니다. 태그를 .이 비 전역 상태뿐만 아니라의에 CitrusListHolder 아닌 정수를 홀더에 다시 설정 –

+0

OK 그래서 내가 가진이 :. \t \t \t CitrusListHolder currHolder = (CitrusListHolder) v.getTag(); data.remove (currHolder.currentPosition) ; null 포인터 예외가 발생합니다. currholder.currentPosition을 토스트에 던지더라도 두 번째 줄에서 충돌합니다. –

0

Button에 실제 위치를 설정하지 않았습니다.

Button.setTag() 행을 if 내부에서 텍스트 및 기타 데이터가 설정되는 if-else 조건 외부로 이동하십시오. onClick()에 그것을 가져 오는 동안

public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 
    CitrusListHolder holder = null; 

    if(row == null) 
    { 
     //your implementation 
    } 
    else 
    { 
     //your implementation 
    } 

    CitrusList singleLine = data.get(position); 
    //holder.txtTitle.setText(singleLine.title); 
    rateButton.setTag(String.valueOf(position)); //<==== place it here, so it'll get the real/update position as tag, Convert it to String. 
    return row; 
} 

과 : 그래서 스크롤 또는 갱신 한 후,이 같은 getView()의 모든 호출에 실제 위치를 얻어야한다. 다음과 같은 Integer로 변환 String에 캐스팅 :

int position = Integer.parseInt(v.getTag().toString()); 
관련 문제