<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
<TextView
android:id="@+id/vv_tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/rc_strTitle"
...
<androidx.recyclerview.widget.RecyclerView ##### RecyclerView
android:id="@+id/vv_rvList"
android:layout_width="wrap_content"
...
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
<TextView
android:id="@+id/vv_tvCell" ##### RecyclerView List Cell, just a textView now
...
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
RecyclerView lv_recyclerView = findViewById(R.id.vv_rvList);
// ##### small issue
lv_recyclerView.setLayoutManager(new LinearLayoutManager(this));
String[] lv_data = new String[32];
for (int i = 0; i < 32; i++) {
lv_data[i] = i+"th Element";
}
// #### major issue -- NEED an Adapter (user defined) together
lv_recyclerView.setAdapter(new MyRecyclerViewAdapter(lv_data));
}
}
// https://www.willowtreeapps.com/craft/android-fundamentals-working-with-the-recyclerview-adapter-and-viewholder-pattern
// ##### need 2 -- Adapter and ViewHolder
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private final String[] mv_data;
// ##### ViewHolder as static inner class (subclass)
public static class MyViewHolder extends RecyclerView.ViewHolder {
private final TextView cv_tvCell;
public MyViewHolder(View view) {
super(view);
// (1)##### binding between Adapter variable and XML layout widgets #####
cv_tvCell = view.findViewById(R.id.vv_tvCell);
}
}
// ##### customized constructor, more info in future
public MyRecyclerViewAdapter(String[] data) {
mv_data = data;
}
// ##### connection between Adapter and ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// (2)##### A new view which defines the list cell UI
View lv_view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recyclerview_row, parent, false);
return new MyViewHolder(lv_view);
}
// ##### Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(MyRecyclerViewAdapter.MyViewHolder holder, int position) {
// (3)##### draw list cell by data(index) #####
holder.cv_tvCell.setText(mv_data[position]);
}
// ##### MUST, Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mv_data.length;
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="46sp"
android:layout_margin="8dp" ##### here
android:background="@color/purple_200"> ##### here
<TextView
android:id="@+id/vv_tvCell"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textSize="24sp" /> ##### here
</LinearLayout>
In a nutshell, The Activity class will implement an interface for onClick event, this interface will be passed to the RecyclerView Adapter class, then the ViewHolder class in the RecyclerView will call onClick method defined in the interface, which will pass the view and position of the clicked item to the onClick implementation in the Activity class.
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.RecyclerView;
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private final String[] mv_data;
public static class MyViewHolder extends RecyclerView.ViewHolder {
private final TextView cv_tvCell;
public MyViewHolder(View view) {
super(view);
// Define click listener for the ViewHolder's View
cv_tvCell = view.findViewById(R.id.vv_tvCell);
//// Method 1:
/* view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position : " + getLayoutPosition()
+ " text : " + cv_tvCell.getText(), Toast.LENGTH_SHORT).show();
}
});*/
}
}
public MyRecyclerViewAdapter(String[] data) {
mv_data = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new view, which defines the UI of the list item
View lv_view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recyclerview_row, parent, false);
return new MyViewHolder(lv_view);
//// Method 2: BETTER then Method 3?
/* MyViewHolder lv_holder = new MyViewHolder(lv_view);
lv_view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position : " + lv_holder.getLayoutPosition()
+ " text : " + lv_holder.cv_tvCell.getText(), Toast.LENGTH_SHORT).show();
}
});
return lv_holder;*/
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(MyRecyclerViewAdapter.MyViewHolder holder, int position) {
holder.cv_tvCell.setText(mv_data[position]);
//// Method 3: itemView is hidden defined
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position : " + holder.getLayoutPosition()
+ " text : " + holder.cv_tvCell.getText(), Toast.LENGTH_SHORT).show();
}
});
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mv_data.length;
}
}
public class MainActivity extends AppCompatActivity {
//// HERE
ArrayList lv_data;
MyRecyclerViewAdapter lv_adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//// HERE
lv_data = new ArrayList<>();
for (int i = 0; i < 32; i++) {
lv_data.add(i+"th Element");
}
lv_adapter = new MyRecyclerViewAdapter(lv_data);
lv_recyclerView.setAdapter(lv_adapter);
...
fab.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
//lv_data.add(1, "New Item");
lv_data.remove(2);
lv_adapter.notifyDataSetChanged();
return true;
}
});
}
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
//// HERE
private final ArrayList<String> mv_data;
//// HERE
public MyRecyclerViewAdapter(ArrayList<String> data) {
mv_data = data;
}
@Override
public void onBindViewHolder(MyRecyclerViewAdapter.MyViewHolder holder, int position) {
//// HERE
holder.cv_tvCell.setText(mv_data.get(position));
...
}
...
@Override
public int getItemCount() {
//// HERE
return mv_data.size();
}
public class MainActivity extends AppCompatActivity {
//// HERE
ArrayList lv_data01, lv_data02;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//// HERE
String[] lv_Model = {"iPad","Xoom","Playbook","TouchPad","Surface"};
String[] lv_OS = {"iOS","Android","BlackBerry","WebOS","Windows"};
lv_data01 = new ArrayList<>();
lv_data02 = new ArrayList<>();
Collections.addAll(lv_data01, lv_Model);
Collections.addAll(lv_data02, lv_OS);
lv_adapter = new MyRecyclerViewAdapter(lv_data01, lv_data02);
lv_recyclerView.setAdapter(lv_adapter);
lv_recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
...
fab.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
//// HERE
lv_data01.remove(2);
lv_data02.remove(2);
lv_adapter.notifyDataSetChanged();
return true;
}
});
}
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
//// HERE
private final ArrayList<String> mv_data01, mv_data02;
public static class MyViewHolder extends RecyclerView.ViewHolder {
//// HERE
private final TextView cv_tvModel, cv_tvOS, cv_tvPrice;
public MyViewHolder(View view) {
super(view);
// Define click listener for the ViewHolder's View
//// MODIFY HERE
}
}
//// MODIFY HERE
public MyRecyclerViewAdapter(...
}
...
@Override
public void onBindViewHolder(MyRecyclerViewAdapter.MyViewHolder holder, int position) {
//// MODIFY HERE
//// including click
}
@Override
public int getItemCount() {
//// MODIFY HERE
}
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.example.a11_intent.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.vvBtnTo2.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
////Context ctx = MainActivity.this;
// need MainActivity.this since 'this' is new OnclickListener
Intent lv_it = new Intent(MainActivity.this, MySecondActivity.class);
startActivity(lv_it);
}
});
}
}