【问题标题】:How to start new intent for every whole CardView in RecycleView android?如何在 RecyclerView android 中为每个整个 CardView 启动新意图?
【发布时间】:2016-10-07 02:40:45
【问题描述】:

我已经在 android 中使用 RecycleVeiw 创建了 CardView,现在我想为 recyleview 中的每一项 cardivew 添加意图,请指导我: 我的要求的屏幕截图: 我的适配器类代码在这里给出:

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

private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private List<MapSetData> venues;
public Context context;


public MapAdapter(List<MapSetData> venues, Context context) {
    this.venues = venues;
    this.context = context;
    }

@Override
public VenuesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.map_item, viewGroup, false);
    VenuesViewHolder pvh = new VenuesViewHolder(v);
    return pvh;
}


@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    VenuesViewHolder holder = (VenuesViewHolder) viewHolder;                   holder.venues_picture.setImageResource(venues.get(position).venue_picture);
        holder.card_title_txt.setText(venues.get(position).card_title_txt);
        holder.location_qs.setText(venues.get(position).location_qs);
}


@Override
public int getItemViewType(int position) {
    if (isPositionHeader(position) == 0) {
        return TYPE_HEADER;
    } else if (isPositionHeader(position) == 1) {
        return TYPE_ITEM;
    } else {
        return 0;
    }
}

private int isPositionHeader(int position) {
    return position;
}


@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

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

}

public static class ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(View v) {
        super(v);
    }
}

public class VenuesViewHolder extends ViewHolder implements View.OnClickListener {
    ImageView venues_picture;
    TextView card_title_txt;
    TextView location_qs;
    CardView cv;
    public Context context;

    public VenuesViewHolder(View v) {
        super(v);
        v.setOnClickListener(this);
        context = v.getContext();
        cv = (CardView) itemView.findViewById(R.id.cv);
        venues_picture = (ImageView) itemView.findViewById(R.id.match_picture);
        card_title_txt = (TextView) itemView.findViewById(R.id.card_title_txt);
        location_qs = (TextView) itemView.findViewById(R.id.location_qs);
    }

    @Override
    public void onClick(View v) {

        Intent intent = new Intent(context, MapDetails.class);
        context.startActivity(intent);
    }
}
}

【问题讨论】:

  • 几乎完成了。 setOnClickListener(this) 用于卡片视图的每个项目。例如:venues_picture.setOnClickListener(this) 和方法 onClick(View v) 检查 id if(v.getId()==R.id.match_picture){//do something}
  • 不是cardview的每一项,而是recycleview中的每一项,比如整个cardview触摸监听器,我希望得到我的问题
  • 如果是整个卡片视图,设置cv.setOnClickListener(this)。您可以使用 getAdapterPosition() 检查不同卡片视图的位置。
  • 是的,我想要这个,你能给我一些代码来帮助我吗?
  • 这很容易。你可以看到一些例子here

标签: android listview android-fragments android-studio android-intent


【解决方案1】:

试试这个!

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        VenuesViewHolder holder = (VenuesViewHolder) viewHolder;                            
holder.venues_picture.setImageResource(venues.get(position).venue_picture);
            holder.card_title_txt.setText(venues.get(position).card_title_txt);
            holder.location_qs.setText(venues.get(position).location_qs);

     holder.v.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, MapDetails.class);
            context.startActivity(intent);
                }
            });

    }

【讨论】:

  • 是的,我会试试这个。
  • 你能告诉我 holder.v 是什么吗?我的意思是这里的“v”是什么?
  • v 是你在 ViewHolder 的构造函数中传入的 View
  • 在onBindViewHolder()方法中没有访问到,
  • 基本上是卡片视图,在图片中显示我想添加到每个项目的意图
【解决方案2】:

您可以像这样将 onclickListener 设置为您的卡片视图

public class VenuesViewHolder extends ViewHolder implements View.OnClickListener {
ImageView venues_picture;
TextView card_title_txt;
TextView location_qs;
CardView cv;
public Context context;

public VenuesViewHolder(View v) {
    super(v);
    v.setOnClickListener(this);
    context = v.getContext();
    cv = (CardView) itemView.findViewById(R.id.cv);
    venues_picture = (ImageView) itemView.findViewById(R.id.match_picture);
    card_title_txt = (TextView) itemView.findViewById(R.id.card_title_txt);
    location_qs = (TextView) itemView.findViewById(R.id.location_qs);
}

@Override
public void onClick(View v) {
    int viewId = v.getId();
    switch(viewId){
         case R.id.cv :
         Intent intent = new Intent(context, MapDetails.class);
         context.startActivity(intent);
          break;
     }


}
}

【讨论】:

  • 如果我在 switch 语句中添加另一个 case 那么我将如何添加这个,因为 R.id.cv 只有一个 cardview 是真的吗?
  • switch(viewId){ case R.id.cv : Intent intent = new Intent(context, MapDetails.class); context.startActivity(intent); break; case R.id.match_picture: Intent intent = new Intent(context, MapDetails.class); context.startActivity(intent); break; }
  • 你的答案很好,但我需要在 recycleview 中的每个位置添加意图,即 cardview 是 recycleview 的单个项目,所以我想添加意图到 recyclew 项目而不是 cardview
【解决方案3】:

试试下面的代码,

   @Override
   public void onClick(View v) {

       Intent intent;

       switch (isPositionHeader)
       {
           case 0:
            if(v.getId()==R.id.match_picture)
                        intent = new Intent(context, MapDetails.class); 

            else if(v.getId()==R.id.card_title_txt)
                        intent = new Intent(context, CardTitle.class); 
           break;



           case 1:
            if(v.getId()==R.id.match_picture)
                        intent = new Intent(context, MapDetails1.class); 

            else if(v.getId()==R.id.card_title_txt)
                        intent = new Intent(context, CardTitle1.class); 
           break;

          // And So

       }

    if(intent != null)
           startActivity(intent);
   }

【讨论】:

  • 将其设置为公开,因为目前它是私有的,如“private int isPositionHeader()”
  • 你的回答也是针对每一项 cardview 我需要在 recycleview 中的整个 cardview 触摸监听器
  • 然后使用这一行 cv.setOnClickListener(this);为 cardview 初始化 cv 后
【解决方案4】:

谢谢大家,我这样解决了我的问题,

public VenuesViewHolder(View v) {
        super(v);
        context = v.getContext();
        cv = (CardView) itemView.findViewById(R.id.cv);
        venues_picture = (ImageView)   itemView.findViewById(R.id.match_picture);
        card_title_txt = (TextView) itemView.findViewById(R.id.card_title_txt);
        location_qs = (TextView) itemView.findViewById(R.id.location_qs);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos = getAdapterPosition();
                if (pos == 0) {
                    context.startActivity(new Intent(context, MapDetails.class));
                } else if (pos == 1) {
                    context.startActivity(new Intent(context, MapDetailsTwo.class));
                } else if (pos == 2) {
                    context.startActivity(new Intent(context, MapDetails.class));
                }
            }
        });
    }

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2023-04-03
    • 1970-01-01
    • 2018-01-02
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多