简体   繁体   中英

How to add Toast position when set onclick for a RecyclerView and GridLayoutManager?

I have Just Created a recycler View that contains Cards All I want to setOnCLick for this recycler view toast with a position item Click as It's my first time to use a recycler view I always use a list View with a setOnItemClickListner

How to add toast position like this in Gridview ?


My Adapter Class

grid_View.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "Clicked letter: " + letters_list[position], Toast.LENGTH_SHORT).show();
}
        });

MainActivity class

public class MainActivity extends AppCompatActivity {

public static long size;
int numberOfColumns = 5;
MyRecyclerViewAdapter adapter;


AdapterProgressBar adapterProgressBar;
ProgressBar progressBar;
int currentItems, totalItems, scrollOutItems;
Boolean isScrolling = false;
GridLayoutManager manager;
ArrayList list;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    // data to populate the RecyclerView with
    final String data[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
            "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34",
            "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48","49","50"};




    // set up the RecyclerView
    final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvNumbers);
    recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
    adapter = new MyRecyclerViewAdapter(this,data);
    //adapter.setClickListener((MyRecyclerViewAdapter.ItemClickListener) this);
    recyclerView.setAdapter(adapter);



    //progress bar  --> scroll
    manager = new GridLayoutManager(this, 5);
    progressBar = (ProgressBar) findViewById(R.id.progress);
    list = new ArrayList(Arrays.asList(data));
    adapterProgressBar = new AdapterProgressBar(list,this);
    recyclerView.setAdapter(adapterProgressBar);
    //recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
    recyclerView.setLayoutManager(manager);




    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
                isScrolling = true;
            }
        }



        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            currentItems = manager.getChildCount();
            totalItems = manager.getItemCount();
            scrollOutItems = manager.findFirstCompletelyVisibleItemPosition();

            //Size of array
            size = list.size();
            //Toast.makeText(MainActivity.this, "newnumber = " + newNumber, Toast.LENGTH_SHORT).show();


            if(isScrolling && currentItems + scrollOutItems == totalItems){
                //fetch data
                isScrolling = false;
                fitchData(size);

            }
        }

    });




    /*gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(MainActivity.this, "Clicked letter: " + data[position], Toast.LENGTH_SHORT).show();
        }
    });*/

//Ends OnCreate
}


//This function to add numbers after scroll
private void fitchData(final long size){
    progressBar.setVisibility(View.VISIBLE);
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            for (long i=size+1 ; i<size+51 ; i++){
                list.add( i + "");
                adapterProgressBar.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);
            }

            //Toast.makeText(MainActivity.this, "size = " + size , Toast.LENGTH_SHORT).show();
        }
    }, 5000);
}
}



public class MyRecyclerViewAdapter extends 
RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

private String[] mData;
private LayoutInflater mInflater;
private ItemClickListener mClickListener;



//progress
ArrayList<String> data;
Context context;


// data is passed into the constructor
MyRecyclerViewAdapter(Context context, String[] data) {
    this.mInflater = LayoutInflater.from(context);
    this.mData = data;
}



// inflates the cell layout from xml when needed
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
{
    View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);


    //LayoutInflater inflater = LayoutInflater.from(context);
    return new ViewHolder(view);
}




// binds the data to the TextView in each cell
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) 
{
    holder.myTextView.setText(mData[position]);




}

// total number of cells
@Override
public int getItemCount() {
    return mData.length;
}



// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView myTextView;

    ViewHolder(View itemView) {
        super(itemView);
        myTextView = itemView.findViewById(R.id.info_text);
        itemView.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {

        Toast.makeText(context, "Clicked Positionnnnn", Toast.LENGTH_SHORT).show();
        if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());



    }

}


// convenience method for getting data at click position
String getItem(int id) {
    return mData[id];
}

// allows clicks events to be caught
void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);

}


}

As you define an interface in custom adapter, you should implement this interface in activity like this:

public class MainActivity extends AppCompatActivity implements 
            MyRecyclerViewAdapter. ItemClickListener{

         //......
         adapter = new MyRecyclerViewAdapter(this,data);
         adapter.setClickListener(this);
         //......

        @Override
        public void onItemClick(View view, int position) {           
         Toast.makeText(context, "Clicked:"+ String.valueOf(position),
                 , Toast.LENGTH_SHORT).show();
        }

        //......
}

The Recycler view directly provides the click listener on the itemView in onBindViewHolder method.

This code you can directly put into your onBindViewHolder method of recycler adapter.

holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context c = v.getContext();
Toast.makeText(c,"Hello 
Javatpoint",Toast.LENGTH_SHORT);
}
});

But if you want to implement it with the interface below is the code snippet:

public interface OnItemClickListener
{
    void onClick(int position);
}

The Activity could implement this interface, or instantiate an anonymous inner class. So your adapter could look like this:

public class MyRecyclerAdapter extends RecyclerView.Adapter
{
    public final OnItemClickListener listener;

    public MyRecyclerAdapter(OnItemClickListener listener)
    {
         this.listener = listener;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
     /** Here is you code**/

            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   listener.onClick(position);
                }
            });
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM