Search code examples
javaandroidandroid-recyclerviewonclicklistenerrecyclerlistview

When I click on the RecyclerView Item in MainActivity I want the TextView in MainActivity to display Item's title


>>>>>>>MAIN ACTIVITY XML<<<<<<<

As you can see the TextView is on the top, that's where I want to display the title of selected RecyclerView item. Most of the tutorials and blog teach to navigate to next activity when an item is clicked, but that isn't something I am looking for.

MainActivity.java

public class MainActivity extends AppCompatActivity implements ItemAdapterCallback {

    private RecyclerView recyclerView;
    private List<Item> itemList;
    private ItemAdapter itemAdapter;
    private SearchView searchView;
    TextView itemname;

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

    private void initialize(Bundle savedInstanceState) {
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        searchView = (SearchView) findViewById(R.id.searchView);
        searchView.clearFocus();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                filterList(newText);
                return true;
            }
        });
    }

    private void filterList(String newText) {
        List<Item> filteredList = new ArrayList<>();
        for (Item item : itemList) {
            if (item.getItemName().toLowerCase().contains(newText.toLowerCase())){
                filteredList.add(item);
            }
        }

        if (filteredList.isEmpty()) {
            Toast.makeText(this, "No Match", Toast.LENGTH_SHORT).show();
        } else {
            itemAdapter.setFilteredList(filteredList);
        }
    }

    private void initializeLogic() {
        RecyclerView();
    }

    private void RecyclerView () {
        itemList = new ArrayList<>();
        //  Adding Data to Item List
        itemList.add(new Item("Black", R.drawable.android_black));
        itemList.add(new Item("Blue", R.drawable.android_blue));
        itemList.add(new Item("Green", R.drawable.android_green));
        itemList.add(new Item("Pink", R.drawable.android_pink));
        itemList.add(new Item("Red", R.drawable.android_red));
        itemList.add(new Item("Yellow", R.drawable.android_yellow));
        itemList.add(new Item("Black", R.drawable.android_black));
        itemList.add(new Item("Blue", R.drawable.android_blue));
        itemList.add(new Item("Green", R.drawable.android_green));
        itemList.add(new Item("Pink", R.drawable.android_pink));
        itemList.add(new Item("Red", R.drawable.android_red));
        itemList.add(new Item("Yellow", R.drawable.android_yellow));

        itemAdapter = new ItemAdapter(itemList, this);
        recyclerView.setAdapter(itemAdapter);
    }

    @Override
    public void onItemClicker() {
        //????????????????        
    }
}

Item.java

public class Item {
    private String itemName;
    private int itemImage;

    public Item(String itemName, int itemImage) {
        this.itemImage = itemImage;
        this.itemName = itemName;
    }

    public int getItemImage() {
        return itemImage;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
}

ItemAdapter.java

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemViewHolder> {

    private List<Item> itemList;
    int row_index = -1;
    private ItemAdapterCallback callback;

    public ItemAdapter(List<Item> itemList, ItemAdapterCallback callback) {
        this.itemList = itemList;
        this.callback = callback;
    }

    public void setFilteredList(List<Item> filteredList) {
        this.itemList = filteredList;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.each_item, parent, false );
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {

        Item item = itemList.get(position);
        holder.itemNameTv.setText(item.getItemName());
        holder.itemImageView.setImageResource(item.getItemImage());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ////////////////////////////
                //Toast.makeText(view.getContext(), "Item is clicked" + item.getItemName(), Toast.LENGTH_SHORT).show();
            }
        });

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                row_index = position;
                notifyDataSetChanged();
                Toast.makeText(v.getContext(), "Item is clicked " + position + " " + item.getItemName(), Toast.LENGTH_SHORT).show();
                callback.onItemClicker();
            }
        });

        if (row_index == position) {
            holder.cardView.setBackgroundColor(Color.LTGRAY);
        } else {
            holder.cardView.setBackgroundColor(Color.WHITE);
        }
    }

    @Override
    public int getItemCount() {
        if (itemList == null) {
            return 0;
        } else {
            return itemList.size();
        }
    }

    public class ItemViewHolder extends RecyclerView.ViewHolder{
        public TextView itemNameTv;
        public ImageView itemImageView;
        public CardView cardView;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            cardView = itemView.findViewById(R.id.eachCardView);
            itemNameTv =  itemView.findViewById(R.id.eachItemTextView);
            itemImageView = itemView.findViewById(R.id.eachItemImageView);
        }
    }

}

ItemAdapterCallback (Interface)

public interface ItemAdapterCallback {
    void onItemClicker();
}

Solution

  • You are just missing few things here.

    1- if you want to get the title from the adapter you will need to pass the title in your Callback Interface

    public interface ItemAdapterCallback {
    void onItemClicker(String title);}
    

    2- after this change you will override the onItemClickerCallback in your mainActivity it will look like this

     @Override
    public void onItemClicker(String title) {
          // your title , 
          itemname.setText(title);
    }
    

    3- in onClick function of the adapter add this line

    holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               if(callback!=null){
                  callback.onItemClicker( item.getItemName());
               }
            }
        });
    

    that's all you need to do to show the title in your mainActivity from adapter.