简体   繁体   中英

Android : How to set ID's for every single items in list of arrays of card view and be clickable?

Hye... I'm new in android development and i'm facing a little bit problem on the android project that I'm in right now. The codes below successfully returning the list of items on the activity_ticket_info.xml layout. Since the number of items appeared based on the looping process, how to set an ID on every single items that appeared so afterwards it could be set as clickable items to intent to another activity layout? Please help me to figure this out. Thanks a lot for the help..

TicketAdapter.java

 package info.androidhive.navigationdrawer.activity;

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import info.androidhive.navigationdrawer.R;
import info.androidhive.navigationdrawer.ticketfragments.ComboA_TicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.ComboB_TicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.ComboC_TicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.ComboD_TicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.ComboE_TicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.ComboF_TicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.DuckTourTicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.FOneSimulatorFragment;
import info.androidhive.navigationdrawer.ticketfragments.SixDCinemotionTicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.SkyCabBasicTicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.SkyCabExpressLaneTicketFragment;
import info.androidhive.navigationdrawer.ticketfragments.SkyCabPrivateVipGlassTicketFragment;

import static android.R.attr.x;

/**
 * Created by user on 11/14/2016.
 */

public class TicketAdapter extends RecyclerView.Adapter<TicketViewHolder>
{
    String [] name = {
                    "Combo A",
                    "Combo B",
                    "Combo C",
                    "Combo D",
                    "Combo E",
                    "Combo F",
                    "Combo G",
                    "Combo H",
                    "Combo I",
                    "Combo J",
                    "Combo K",
                    "Combo L"
                    };

    Context context;
    LayoutInflater inflater;

    public TicketAdapter(Context context)
    {
        this.context = context;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public TicketViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View v = inflater.inflate(R.layout.item_list, parent, false);

        TicketViewHolder viewHolder = new TicketViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(TicketViewHolder holder, final int position)
    {
        holder.textTitle.setText(name[position]);
/*      holder.textDesc.setText(desc[position]);*/
        holder.imageView.setOnClickListener(clickListener);
        holder.imageView.setTag(holder);
//        holder.imageView.setId(positionId[position]);

        holder.cardview.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                switch (position)
                {
                    case 0:
                        Intent intent0 = new Intent(v.getContext(),SkyCabBasicTicketFragment.class);
                        v.getContext().startActivity(intent0);
                        break;
                    case 1:
                        Intent intent1 = new Intent(v.getContext(),SkyCabExpressLaneTicketFragment.class);
                        v.getContext().startActivity(intent1);
                        break;
                    case 2:
                        Intent intent2 = new Intent(v.getContext(),SkyCabPrivateVipGlassTicketFragment.class);
                        v.getContext().startActivity(intent2);
                        break;
                    case 3:
                        Intent intent3 = new Intent(v.getContext(),SixDCinemotionTicketFragment.class);
                        v.getContext().startActivity(intent3);
                        break;
                    case 4:
                        Intent intent4 = new Intent(v.getContext(),DuckTourTicketFragment.class);
                        v.getContext().startActivity(intent4);
                        break;
                    case 5:
                        Intent intent5 = new Intent(v.getContext(),FOneSimulatorFragment.class);
                        v.getContext().startActivity(intent5);
                        break;
                    case 6:
                        Intent intent6 = new Intent(v.getContext(),ComboA_TicketFragment.class);
                        v.getContext().startActivity(intent6);
                        break;
                    case 7:
                        Intent intent7 = new Intent(v.getContext(),ComboB_TicketFragment.class);
                        v.getContext().startActivity(intent7);
                        break;
                    case 8:
                        Intent intent8 = new Intent(v.getContext(),ComboC_TicketFragment.class);
                        v.getContext().startActivity(intent8);
                        break;
                    case 9:
                        Intent intent9 = new Intent(v.getContext(),ComboD_TicketFragment.class);
                        v.getContext().startActivity(intent9);
                        break;
                    case 10:
                        Intent intent10 = new Intent(v.getContext(),ComboE_TicketFragment.class);
                        v.getContext().startActivity(intent10);
                        break;
                    case 11:
                        Intent intent11 = new Intent(v.getContext(),ComboF_TicketFragment.class);
                        v.getContext().startActivity(intent11);
                        break;
                }

            }
        });
    }

    View.OnClickListener clickListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            TicketViewHolder vholder = (TicketViewHolder) v.getTag();
            int position = vholder.getPosition();

/*            Toast.makeText(context,"You have choose " + position,Toast.LENGTH_LONG ).show();*/

            //Display toast message with each tickets caption details
            Toast.makeText(context,"You have choose " + (name[position]),Toast.LENGTH_LONG ).show();
        }
    };

    @Override
    public int getItemCount()
    {
        return name.length;
    }
}

**UPDATED : I'm trying to implement a switch case statement as above for every single items that need to be navigated to each fragment layout and there is no errors found at all but it doesn't work. Could the above switch case statement be the proper way to navigate each items or there is another better way to implement? **

TicketInfoActivity.java

package info.androidhive.navigationdrawer.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import info.androidhive.navigationdrawer.R;

import static info.androidhive.navigationdrawer.R.id.name;

public class TicketInfoActivity extends AppCompatActivity
{
    RecyclerView ticketView;

    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ticket_info);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        ticketView = (RecyclerView) findViewById(R.id.my_recycler_view);

        TicketAdapter adapter = new TicketAdapter(this);
        ticketView.setAdapter(adapter);
        ticketView.setHasFixedSize(true);
        ticketView.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == android.R.id.home)
        {
            // finish the activity
            onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

TicketViewHolder.java

package info.androidhive.navigationdrawer.activity;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import info.androidhive.navigationdrawer.R;

public class TicketViewHolder extends RecyclerView.ViewHolder
{
    TextView textTitle,textDesc;
    ImageView imageView;
    CardView cardview;

    public TicketViewHolder(View itemView)
    {
        super(itemView);

        textTitle = (TextView) itemView.findViewById(R.id.list_title);
/*        textDesc = (TextView) itemView.findViewById(R.id.list_desc);*/
        imageView = (ImageView) itemView.findViewById(R.id.list_avatar);
        cardview = (CardView) itemView.findViewById(R.id.ticket_view);
    }
}

item_list.xml

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ticket_view"
    android:layout_width="match_parent"
    android:layout_height="160dp"
    android:layout_marginBottom="16dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:background="#C5CAE9"
    android:foreground="?attr/selectableItemBackground"
    android:theme="@style/ThemeOverlay.AppCompat.Light">

    <RelativeLayout
        android:layout_width="match_parent"
        android:gravity="center"
        android:paddingTop="16dp"
        android:layout_height="match_parent">

        <!-- Icon -->
        <ImageView
            android:id="@+id/list_avatar"
            android:layout_width="match_parent"
            android:layout_height="85dp"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_tickets_info_color_48dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

        <!-- Title -->
        <TextView
            android:id="@+id/list_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Product Description Goes Here... "
            android:textColor="#000000"
            android:textStyle="bold"
            android:textAppearance="?attr/textAppearanceListItem"
            android:textSize="18sp"
            android:gravity="center_horizontal"
            android:layout_below="@+id/list_avatar"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="15dp"/>

        <!-- Description -->

    </RelativeLayout>
</android.support.v7.widget.CardView>

activity_ticket_info.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_ticket_info"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="info.androidhive.navigationdrawer.activity.TicketInfoActivity">

    <!--<include layout="@layout/actionbar_layout" />-->

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:paddingBottom="16dp"
        android:paddingTop="16dp"
        android:scrollbars="vertical"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

I think there is no such method to provide ID for each item dynamically.According to the program above you can select only a single item in the recyclerView at a time. Better create a method in main activity as below

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

and set the clicked string to activity by calling from onClick of the adapter

context.setRVAdapterSelectedItem(selectedString);

So that you will get the list in Activity. It is always better to use a model class for item list. Hence you can use a boolean to identify if the item is selected or not and using that you can highlight item in onBindViewHolder

If you want to use it later as clickable, instead of assigning the id, you can set the listener for each item when they are returned and call the intent.

However if you still want to assign id, you can use method setId(int) which is available for all types of widgets.. and views

if you want to just make clickable your every cardview item you can make interface

public interface ItemClickListener {
    void onItemClick(View v, int pos);
}

and implement this on you adapter class like this

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

private List<Model> list;
Context mContext;
public MyAdapter(Context context,List<Model> list) {
    mContext=context;
    this.list = list;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view, parent, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    final Model model = list.get(position);
    holder.name.setText("name :"+model.getName());
    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onItemClick(View v, int position) {
            Snackbar.make(v,list.get(position).getName(),Snackbar.LENGTH_SHORT).show();
            Intent i=new Intent(mContext, Showname.class);
            mContext.startActivity(i);
        }
    });
}

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

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
    public TextView name,branch,sem;
    ItemClickListener itemClickListener;
    public MyViewHolder(View itemView) {
        super(itemView);
        name = (TextView)itemView.findViewById(R.id.s_name);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        this.itemClickListener.onItemClick(v,getLayoutPosition());
    }
    public void setItemClickListener(ItemClickListener ic)
    {
        this.itemClickListener=ic;
    }
}
}

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