Android - 按名称选择卡片

标签 android android-layout android-cardview

我创建了一个 CardViews 列表,我在其中使用 TextView 为每个列表添加了一个名称。我的问题是我找不到一种方法来根据 TextView 中的名称来选择和单击特定卡片。这是我到目前为止所做的:

主页 Activity

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

 //cards
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    serviceList = new ArrayList<>();
    adapter = new ServicesAdapter(this, serviceList);
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
    prepareServices();
}

private void prepareServices() {
    Service  a = new Service("Service 1");
    serviceList.add(a);

    a = new Service("Service 2");
    serviceList.add(a);

    a = new Service("Service 3");
    serviceList.add(a);

    a = new Service("Service 4");
    serviceList.add(a);

    a = new Service("Service 5");
    serviceList.add(a);

    a = new Service(ADD_NEW_ITEM_TYPE);
    serviceList.add(a);

    adapter.notifyDataSetChanged();
}

   /**
 * RecyclerView item decoration - give equal margin around grid item
 */
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {

    private int spanCount;
    private int spacing;
    private boolean includeEdge;

    public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
        this.spanCount = spanCount;
        this.spacing = spacing;
        this.includeEdge = includeEdge;
    }
}

private int dpToPx(int dp) {
    Resources r = getResources();
    return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()));
}

服务适配器

 private Context mContext;
private List<Service> serviceList;

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title;

    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.title);
        if(title.getText().toString().equals(ADD_NEW_ITEM_TYPE)) {
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent redirect= new Intent(v.getContext(), ListServices.class);
                    v.getContext().startActivity(redirect);
                }
            });//end onclick listener
        }


    }


}


public ServicesAdapter(Context mContext, List<Service> serviceList) {
    this.mContext = mContext;
    this.serviceList = serviceList;
}

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

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    Service serv = serviceList.get(position);
    holder.title.setText(serv.getName());

}


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

最佳答案

由于您需要在每一行中使用 ADD_NEW_ITEM_TYPE 检查标题值,因此您必须将检查代码移动到 onBindViewHolder() 中,以便您可以创建 onBind viewHolder 中的方法并从 onBindViewHolder()

调用它

编辑:我完全重写了 ServicesAdapter 类:

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


    private Context mContext;
    private List<Service> serviceList;


    public ServicesAdapter(Context mContext, List<Service> serviceList) {
        this.mContext = mContext;
        this.serviceList = serviceList;
    }

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

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        holder.onBind();
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title;

        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
        }

        public void onBind() {
            //do what ever you want here for setting data

            String ttileVal = serviceList.get(getAdapterPosition()).getName();
            title.setText(titleVal);


            if (titleVal.equals(ADD_NEW_ITEM_TYPE)) {
                title.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent redirect = new Intent(mContext, ListServices.class);
                        mContext.startActivity(redirect);
                    }
                });//end onclicklistener
            }

        }


    }


}

关于Android - 按名称选择卡片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394784/

相关文章:

java - ObjectAnimator 不反转

android - 结合webview-android的搜索栏和地址栏

android - 更新卡片 View 列表中的文本?

android - 是否可以将 .doc 转换为 Spannables

android - 如何在 Android 的 Spinner View 中添加左侧可绘制对象

android - 微调器显示像对话框

java - Android 中按钮的边距未以编程方式设置

安卓工作室 : CardView change function once clicked

Android M及以上存储权限问题

java - 铃声偏好根本不触发任何东西