2015-01-17 3 views
2

recyclerview 및 어댑터를 처음 사용합니다. RecyclerView와 Onclick이 작동합니다 (Google 덕분에 : https://github.com/googlesamples/android-RecyclerView). 그것은 로그에 쓰는 setOnClickListener를 가지고 있습니다. 하지만 내가 클릭 할 때 목록에서 항목을 제거하는 방법을 알아 내려고 노력하고있어 - 어댑터를 사용하는 ArrayList로 이동하여 notifyItemInserted를 실행하여 디스플레이를 업데이트하는 방법을 알 수 없다.OnClick에서 어댑터 내의 항목을 제거하는 데 문제가 있습니다.

다른 게시물 (Android RecyclerView 추가 & 항목 삭제 - Android RecyclerView addition & removal of items)을 검토하는 중 낙원/자레드 버로우 스가 실행되도록 만들었습니다. 그러나 일부 코드가 누락 된 것처럼 보였고 누군가가 나를 위해 구멍을 채울 수 있기를 바랬습니다. (나는이 다른 포스트에 질문을하기 위해 그곳에 질문 할 수 없었다).

예를 들어 어디서나 mItemClickListener가 정의되어 있지는 않습니다. RecyclerView.Adapter를 확장하는 클래스와 RecyclerView.ViewHolder를 확장하는 클래스 사이의 연결도 확실하지 않습니다. 여기

내 RecyclerView.Adapter입니다 : 내가 다른 StackOverflow의 질문에서 어댑터를 사용하는 것을 시도하고있다

public class RVAdapter1 extends RecyclerView.Adapter<RVAdapter1.ViewHolder> { 
private static final String TAG = "debug"; 
private int itemCounter = 0; 

private List<String> feedItemList; 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    private final TextView textView; 

    public ViewHolder(View v) { 
     super(v); 
     v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "Element " + getPosition() + " clicked."); 
       //feedItemList.remove(getPosition()); 
       //notifyItemRemoved(getPosition()); 
      } 
     }); 
     textView = (TextView) v.findViewById(R.id.textView); 
    } 

    public TextView getTextView() { 
     return textView; 
    } 
} 

public RVAdapter1(List<String> dataSet) { 
    feedItemList = dataSet; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.text_row_item, viewGroup, false); 
    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, final int position) { 
    Log.d(TAG, "Element " + position + " set."); 
    viewHolder.getTextView().setText(String.valueOf(feedItemList.get(position))); 
} 

@Override 
public int getItemCount() { 
    return feedItemList.size(); 
} 

public void addItem(int position, String data) { 
    feedItemList.add(position, data); 
    notifyItemInserted(position); 
    Log.d(TAG,"adapter list length=" + feedItemList.size()); 
} 
}  

,하지만 난 연결하는 방법이 확실 (? 또는 결합) 두 개의 어댑터를 어디서 mItemClickListener는에서 온 것입니다.

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
public CardView mCardView; 
public TextView mTextViewTitle; 
public TextView mTextViewContent; 
public ImageView mImageViewContentPic; 
//...... 
public ImageView imgViewRemoveIcon; 
public ViewHolder(View v) { 
    super(v); 
    mCardView = (CardView) v.findViewById(R.id.card_view); 
    mTextViewTitle = (TextView) v.findViewById(R.id.item_title); 
    mTextViewContent = (TextView) v.findViewById(R.id.item_content); 
    mImageViewContentPic = (ImageView) v.findViewById(R.id.item_content_pic); 
    //...... 
    imgViewRemoveIcon = (ImageView) v.findViewById(R.id.remove_icon); 

    mTextViewContent.setOnClickListener(this); 
    imgViewRemoveIcon.setOnClickListener(this); 
    v.setOnClickListener(this); 
    mTextViewContent.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View view) { 
      if (mItemClickListener != null) { 
       mItemClickListener.onItemClick(view, getPosition()); 
      } 
      return false; 
     } 
    }); 
} 

@Override 
public void onClick(View v) { 
    //Log.d("View: ", v.toString()); 
    //Toast.makeText(v.getContext(), mTextViewTitle.getText() + " position = " + getPosition(), Toast.LENGTH_SHORT).show(); 
    if(v.equals(imgViewRemoveIcon)){ 
     removeAt(getPosition()); 
    }else if (mItemClickListener != null) { 
     mItemClickListener.onItemClick(v, getPosition()); 
     } 
    } 
} 

public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { 
    this.mItemClickListener = mItemClickListener; 
} 

public void removeAt(int position) { 
    mDataset.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(getPosition, mDataSet.size()); 
}  

이것은 사소한 질문 일지 모르지만 나는 누군가가 기꺼이 제공 할 수있는 도움에 감사 할 것입니다 ... 감사합니다!

답변

-1

좋아, 잘 작동 해. ViewHolder를 "공용 정적 클래스"로 만드는 대신 "공용 클래스"로 만들 필요가있었습니다. 그렇다면 setOnClickListener 블록에서 직접 arraylist를 수정할 수있었습니다.

1

어떤 항목을 클릭했는지 파악하는 데 어려움이 있습니까? 따라서 getPosition() 메소드가 필요하다.

내 조언은 뷰의 setTag() 메소드를 사용하는 것이고 태그는 목록의 피드 항목 위치가됩니다. ,

@Override 
public void onClick(View v) { 
    int position = (Integer)v.getTag(); 
    feedItemList.remove(position); 
    notifyItemRemoved(position); 
} 

을이 당신이 어댑터가 View.OnClickListener을 확장 할 수 있습니다 작동하려면 사용자가 액세스 할 수있는 그런 식으로이 같은 OnClickListener를을 만들 이후

@Override 
public void onBindViewHolder(ViewHolder viewHolder, final int position) { 
    Log.d(TAG, "Element " + position + " set."); 
    viewHolder.getTextView() 
     .setText(String.valueOf(feedItemList.get(position))); 
    viewHolder.getRemoveIcon().setTag(position); 
} 

: 그것은 다음과 같이 보일한다 배열 및 통지 메소드

+0

답장을 보내 주셔서 감사합니다. 내 문제는 어떤 항목을 클릭했는지 알 수 없지만 ArrayList에 액세스 할 수 없어서 OnClick이 있던 코드에서 항목을 제거 할 수 없다는 것이 아닙니다. 아래 내 대답을 참조하십시오. – dbaddorf

관련 문제