2016-09-24 1 views
1

내 앱 안에 Facebook 용 사진 선택 도구를 쓰고 있습니다. 그리드 레이아웃이있는 recyclerview가 있는데 스크롤을 방지하고 싶습니다. scrollToPosition를 사용하여이 작업을 수행하고이 작품이 아니라 방법은 내가 원하는합니다RecyclerView notifyDataSetChange 최대 스크롤링, 내가 원하는대로 작동하지 않습니다.

문제

내가 그 행이 위쪽으로 이동하고 숫자 1 표시되는 행이되는 2 줄에 사진을 클릭, 3 행을 클릭하면 문제가 발생합니다.

보기가 보이는 경우 리사이클러를 이동하지 않으려면 마지막으로 보이는 행에있는 사진을 클릭하면 스크롤을 동일하게 유지하고 싶습니다. 마지막 행을 첫 번째 행으로 만들고 싶습니다.

내가 내가 다음 setNestedScrollingEnabled를 호출 시도, 나는이 문제를 해결하기 위해 여러 가지를 시도

그것을 해결하기 위해 시도 나는 어쩌면 스크롤을 사용하지 않도록 설정하면에 recyclerview을 잠글 것이라고 생각이 How to disable RecyclerView scrolling?

public static void onItemClick(int position){ 
    //picker.setNestedScrollingEnabled(false); 
    for(int k = 0; k<photoBag.size();k++) { 
     if(k == position) 
      photoBag.set(position, new PhotoBag(photoBag.get(position).getPhoto(), true)); //Here im marking the photo to selected 
     else 
      photoBag.set(k, new PhotoBag(photoBag.get(k).getPhoto(), false));//Here im setting unselecting all the other photos 
    } 

    picker.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 

    picker.scrollToPosition(position); 

    //Log.d("FacebookPicker", "position " + grid.findFirstCompletelyVisibleItemPosition()); 
    //picker.setNestedScrollingEnabled(true); 
} 

corrent 위치 그러나 그것은 바로 위로 뛰지 않았다.

는 또한 오프셋 및 notifyDataSetChange를 호출 후 설정 수직을 받고 시도하지만 난

편집

어댑터

class PickerAdapter extends RecyclerView.Adapter<PickerAdapter.PickerAdapterHolder> { 
public final String TAG = "PickerAdapter"; 

private ArrayList<PhotoBag> photoBag; 
private Context context; 

private OnClickListener onClickListener; 


class PickerAdapterHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    ImageView photo; 
    ImageView imageBorder; 

    PickerAdapterHolder(View view) { 
     super(view); 
     photo = (ImageView) view.findViewById(R.id.photoItem); 
     photo.setOnClickListener(this); 
    } 


    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.photoItem: 
       FacebookPhotoPicker.onItemClick(getAdapterPosition()); //i know that there are better ways to get the clicked item from other class but since im still debuging i don't need to worry about performace i just need it to work 
       break; 
     } 
    } 
} 

PickerAdapter(Context context, ArrayList<PhotoBag> itemList) { 
    this.photoBag = itemList; 
    this.context = context; 
} 


@Override 
public PickerAdapterHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.facebook_picker_item, null); 
    return new PickerAdapterHolder(layoutView); 
} 

@Override 
public void onBindViewHolder(final PickerAdapterHolder holder, final int position) { 
    if(photoBag.get(position).isSelected()){ 
     int border = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, context.getResources().getDisplayMetrics())); 

     Bitmap photo = photoBag.get(position).getPhoto(); 
     photo = Bitmap.createScaledBitmap(photo,photo.getWidth() - (border*2), photo.getHeight() - (border*2), false); 
     photo = addWhiteBorder(photo,border); 
     holder.photo.setImageBitmap(photo); 
    }else { 
     holder.photo.setImageBitmap(photoBag.get(position).getPhoto()); 
    } 
} 

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


private Bitmap addWhiteBorder(Bitmap bmp, int borderSize) { 
    Bitmap bmpWithBorder = Bitmap.createBitmap(bmp.getWidth() + borderSize * 2, bmp.getHeight() + borderSize * 2, bmp.getConfig()); 
    Canvas canvas = new Canvas(bmpWithBorder); 
    canvas.drawColor(Color.WHITE); 
    canvas.drawBitmap(bmp, borderSize, borderSize, null); 
    return bmpWithBorder; 
} 
+0

제가 틀렸을 경우 제게 문제가 생기면 10 개의 항목이 recylerview에 있고 이제는 fb에서 새 항목을 추가하십시오. 지금 아이템을 추가하면 recylerview가 첫 번째 아이템으로 다시 이동합니까? – Hamza

+0

메신저 항목을 추가하지 않고, 내가 사진을 클릭했을 때 오해로 인해 미안하다. 내가 더 명확하게하기 위해 내 질문을 업데이트 할 것이다. 내가 선택한 항목을 업데이트하면 점프한다. –

+0

선택한 항목을 강조 표시하고 싶다. RecyclerView? 탁탁 같이? – Hamza

답변

1

제거 프로그램 오프셋 설정하는 방법을 찾을 수 없습니다 그 2 줄은 onItemClick

picker.setAdapter(adapter); 
picker.scrollToPosition(position); 

setAdapter 때마다 위치가 재설정되고 새 위치를 다시 설정할 필요가 없습니다.

이렇게하면됩니다. 그렇지 않으면 ID (제공)에 대한 답변을 확인하십시오. How to remain at a scroll position in RecyclerView after adding items at its first index and call notifydatasetchange

+0

문제가 많이 고쳐졌습니다. 어댑터를 재설정해야한다고 생각했습니다. –

관련 문제