1

when i notify my recycleview using notifyDataSetChange() its automatically scroll to top.

I am make this adapter for multi pane purpose.

the app is only for tablet.

so can any please give me the solution for this.??

here is my recycleview adapter.

public class PickersListAdapter extends RecyclerView.Adapter<PickersListAdapter.DataObjectHolder>
{

    private Context context;
    private ArrayList<PickersModel> pickersModelArrayList;
    private ItemsListFragment fragment;

    public PickersListAdapter(Context context, ArrayList<PickersModel> pickersModelArrayList, ItemsListFragment itemsListFragment)
    {
        this.context = context;
        this.pickersModelArrayList = pickersModelArrayList;
        fragment = itemsListFragment;
    }

    @Override
    public PickersListAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent, final int viewType)
    {
        View view = LayoutInflater.from(context).inflate(R.layout.inflate_list_pickers, parent, false);
        DataObjectHolder dataObjectHolder = new DataObjectHolder(view);

        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(final PickersListAdapter.DataObjectHolder holder, final int position)
    {
        holder.myBackground.setSelected(pickersModelArrayList.get(position).isClicked());
        holder.checkBox.setChecked(pickersModelArrayList.get(position).isChecked());
        holder.txtItemName.setText(pickersModelArrayList.get(position).getItemName());
        holder.txtitemQuantity.setText(pickersModelArrayList.get(position).getQuantity());
        Log.e("image url...", pickersModelArrayList.get(position).getItemIcon());
        Glide.with(context).load(pickersModelArrayList.get(position).getItemIcon()).placeholder(R.drawable.ic_item_icon).into(holder.imageView);

        holder.myBackground.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {

                for (int i = 0; i < pickersModelArrayList.size(); i++)
                {
                    pickersModelArrayList.get(i).setClicked(pickersModelArrayList.get(position).getItemName().equals(pickersModelArrayList.get(i).getItemName()));
                }
                notifyDataSetChanged();
            }
        });

    }

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

    public class DataObjectHolder extends RecyclerView.ViewHolder
    {
        private CheckBox checkBox;
        private ImageView imageView;
        private TextView txtItemName, txtitemQuantity;
        private LinearLayout myBackground;

        public DataObjectHolder(View itemView)
        {
            super(itemView);
            myBackground = (LinearLayout) itemView.findViewById(R.id.myBackground);
            checkBox = (CheckBox) itemView.findViewById(R.id.checkBoxPickersItems);
            imageView = (ImageView) itemView.findViewById(R.id.imgItemIconPickerItems);
            txtItemName = (TextView) itemView.findViewById(R.id.txtItemNamePickerItems);
            txtitemQuantity = (TextView) itemView.findViewById(R.id.txtItemQuantityPickerItems);

        }
    }
}
snachmsm
  • 17,866
  • 3
  • 32
  • 74
Prashant Jajal
  • 3,469
  • 5
  • 24
  • 38

1 Answers1

0

Use setTag(), getTag() and then use different functions to notify.

Try something like this:

holder.myBackground.setTag(position);
        holder.myBackground.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (null != v.getTag()) {
                    int position = (int) v.getTag();
                    for (int i = 0; i < pickersModelArrayList.size(); i++) {
                        pickersModelArrayList.get(i).setClicked(pickersModelArrayList.get(position).getItemName().equals(pickersModelArrayList.get(i).getItemName()));
                    }
                    notifyItemChanged(position);
                }
            }
        });
Jimit Patel
  • 4,265
  • 2
  • 34
  • 58
  • 1
    `setTag` ? what for? just implement `OnClickListener` in your `ViewHolder`, thats all – pskink Nov 28 '16 at 11:26
  • `setTag()` is required because in list it should have the position of which view you have clicked. So only changes for that position should reflect, not for every item. – Jimit Patel Nov 28 '16 at 11:28
  • all you need is to implement `OnClickListener` in your `ViewHolder`, no need for `setTag` / `getTag`, see `ViewHolder` documentation for more info – pskink Nov 28 '16 at 11:29
  • it is required. So either you put `ViewHolder` in your tag or `position`. Else everytime it will take position of last displayed item of the list – Jimit Patel Nov 28 '16 at 11:31
  • did you read the `ViewHolder` docs? did you see various `get*Position` methods? – pskink Nov 28 '16 at 11:32
  • Ok let's consider there are 100 items in your list, if you are clicking at 40th position and currently last displayed position in you `RecyclerView` is 45th, which position will it take? `ViewHolder` has many functions for getting position, one which I use normally is `getAdapterPosition`. But inside `onClick()` it will take position of last displayed/binded view, and not of the clicked view – Jimit Patel Nov 28 '16 at 11:36
  • no, `getAdapterPosition` returns `"the Adapter position of the item represented by this ViewHolder."`, if you click on 40th item it will return 40, otherwise what would it be good for if it returned 45? – pskink Nov 28 '16 at 11:38
  • 1
    Ok then discussion closed. Use `getAdapterPosition()` and notify only that part. – Jimit Patel Nov 28 '16 at 11:39