0

嘿...我是 android 开发的新手,我现在在 android 项目上遇到了一些问题。下面的代码成功返回 activity_ticket_info.xml 布局上的项目列表。由于项目的数量是基于循环过程出现的,如何为每个出现的项目设置一个 ID,以便之后可以将其设置为可点击项目以意图进入另一个活动布局?请帮我解决这个问题。非常感谢您的帮助..

票务适配器.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;
    }
}

**更新:我正在尝试为需要导航到每个片段布局的每个项目实现上述 switch case 语句,并且根本没有发现错误,但它不起作用。上面的 switch case 语句是否是导航每个项目的正确方法,还是有另一种更好的实现方法?**

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>
4

3 回答 3

0

如果您想稍后将其用作可点击,而不是分配 id,您可以在每个项目返回时为它们设置侦听器并调用意图。

但是,如果您仍想分配 id,您可以使用可用于所有类型的小部件的方法 setId(int) .. 和视图

于 2016-11-21T05:20:22.647 回答
0

如果你只想让你的每一个cardview项目都可以点击,你可以制作界面

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

并像这样在你的适配器类上实现它

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;
    }
}
}
于 2016-11-21T05:29:45.453 回答
0

我认为没有这种方法可以动态地为每个项目提供 ID。根据上面的程序,您一次只能在 recyclerView 中选择一个项目。更好地在主要活动中创建一个方法,如下所示

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

并通过从适配器的 onClick 调用将单击的字符串设置为活动

context.setRVAdapterSelectedItem(selectedString);

这样您就可以在 Activity 中获得列表。对项目列表使用模型类总是更好。因此,您可以使用布尔值来识别是否选择了该项目,并使用它可以突出显示 onBindViewHolder 中的项目

于 2016-11-21T04:25:15.900 回答