2016-09-05 3 views
0

원하는 결과RecyclerView는 : onclick을 사용자 정의 행

스크롤 위치를 유지하고 사용자 정의 행의 특정보기를 마우스 오른쪽 버튼으로 위치를 부여 특정보기의 잘못된 위치를 제공합니다.

목록 시작 부분과 끝 부분에 수요 데이터를 추가하려고하는 RecyclerView를 사용하고 있습니다.

Scrolling bottom을 통한 데이터 가져 오기가 완벽하게 작동합니다.

그러나 문제 다음과 같이 가진 스크롤 상단 : 어댑터의 onBindViewHolder에

  1. 설정을 클릭 리스너를.
  2. Recyclerview의 OnItemTouchListener에서 클릭 수신기를 설정합니다. 여기

경우입니다 :

나는 목록을 스크롤 한 후 15 개 데이터를로드 및 목록의 상단에 추가합니다. 우리의 의도는 스크롤 위치를 유지하는 것입니다. 는

adapter.notifyItemRangeInserted(0, stringArrayListTemp.size()); 

을 통해 달성하지만 스크롤없이 항목을 클릭하고있는 동안 문제이 될 수있는 다음보기의 OnClickListener를이 잘못된 위치을 제공합니다. 당신은 어댑터의 방법을 확인할 수 있습니다

@Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     String item = moviesList.get(position); 
     holder.title.setText(item); 
     holder.title.setTag(position); 
     holder.title.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Log.e("onClick", "stringArrayList position: " + moviesList.get(position) + " - view position: " + moviesList.get((int) view.getTag())); 
      } 
     }); 
    } 

을하지만 Recyclerview의 addOnItemTouchListener에서 동시에 GetTag의를 사용하여 잘못된 위치를 stringArrayList.get(position)와 함께 올바른 위치를 제공하지만 제공합니다.

mRecyclerView.addOnItemTouchListener(
       new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       Log.e("onItemClick", "stringArrayList position: "+stringArrayList.get(position)+ " - view position: "+stringArrayList.get((int)view.getTag())); 
      } 
     })); 

다음과 같이 목록의 시작 부분에 데이터를 추가하려고하면 정확한 문제가 발생합니다.

// retain scroll position and gives wrong position onClick 
    adapter.notifyItemRangeInserted(0, stringArrayListTemp.size()); 

// does not retain scroll position, scroll to top & gives right position onClick 
    //adapter.notifyDataSetChanged(); 
+0

질문에서 불필요한 코드를 제거 recyclerview 위치를 유지 어떻게

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private final Typeface font; public TextView mTitle, mDetail, mDate, mCategory; public CheckBox mCheckBox; public ImageButton mImageButton; public ImageView mImage; public View mview; private SparseBooleanArray selectedItems = new SparseBooleanArray(); public MyViewHolder(View view) { super(view); mTitle = (TextView) view.findViewById(R.id.item_title); mDetail = (TextView) view.findViewById(R.id.item_detail); mImage = (ImageView) view.findViewById(R.id.item_thumbnail); mDate = (TextView) view.findViewById(R.id.date); mCategory = (TextView) view.findViewById(R.id.category); mCheckBox = (CheckBox) view.findViewById(R.id.checkbox); mImageButton = (ImageButton) view.findViewById(R.id.imageButton); mview = view; view.setOnClickListener(this); view.setOnLongClickListener(this); } @Override public void onClick(View v) { CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); CustomTabsIntent customTabsIntent = builder.build(); customTabsIntent.launchUrl(MainActivity.activity, Uri.parse(mDataSet.get(getAdapterPosition()).getPostLink())); } 

같은 몇 가지 일을하려고합니다. 문제가 발생한 부분 만 게시하십시오. –

답변

0

나를 위해이 코드가 작동, 그래서 난 더 혼란하고 있기 때문에

public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) { 
    int scrollPosition = 0; 

    if (mRecyclerView.getLayoutManager() != null) { 
     scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager()) 
       .findFirstCompletelyVisibleItemPosition(); 
    } 

    switch (layoutManagerType) { 
     case GRID_LAYOUT_MANAGER: 
      mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT); 
      mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER; 
      break; 
     case LINEAR_LAYOUT_MANAGER: 
      mLayoutManager = new LinearLayoutManager(getActivity()); 
      mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER; 
      break; 
     default: 
      mLayoutManager = new LinearLayoutManager(getActivity()); 
      mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER; 
    } 

    mRecyclerView.setLayoutManager(mLayoutManager); 
    mRecyclerView.scrollToPosition(scrollPosition); 
} 
+0

코드를 실행하여 점검 했습니까? 나는 뭔가 새로운 것을 찾지 못한다. 여기에 까다로운 부분이 있기 때문에 목록 시작 부분에 데이터를로드하고 위치를 유지해야합니다. 그렇지 않으면 내 코드와도 완벽하게 작동합니다. –

+0

Recyclerview에 50 개의 항목이 있고 51 개의 항목이있을 때 recyclerview 시작 부분 (0 위치에?)에 012 항목을 추가하려고 할 때 – Hamza

+0

예 정확히 15 개의 데이터 (Item0 ~ Item14)가 처음에는 다음 나는 더 많은 데이터를로드 (Item -1 항목 -1). 그래서 내 목록은 Item -15, Item -14 .... Item0, Item1, ..., Item15와 같습니다. –

관련 문제