2016-09-05 58 views
0

所需的結果RecyclerView:給出錯誤的位置的onClick自定義行

保持滾動位置,並就自定義行的特定視圖右側位置的特定視圖。

我正在使用RecyclerView,其中我試圖在列表的開頭以及列表的末尾添加Demand Data。

通過滾動底部獲取數據是完美的。

但有問題如下滾動頂部:在適配器的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

因爲它製造更多混亂取下問題不必要的代碼。只發布你準確得到問題的部分。 –

回答

0

這對我的代碼工作,所以嘗試一些東西像

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())); 
     } 

我如何保持recyclerview位置

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件物品到來時,你想要添加51件物品到recyclerview開頭(在0位置?) – Hamza

+0

是的確切的,我有15個數據(Item0到Item14)我去加載更多的數據(項目-1到項目-15)。所以我的列表將會像項目-15,項目-14 .... Item0,Item1,...,Item15。 –