【问题标题】:Change view from adapter android从适配器android更改视图
【发布时间】:2017-10-27 01:37:26
【问题描述】:

我有一个包含 RecyclerView 的底部工作表对话框片段,在 RecyclerView 适配器中我有可供选择的项目列表,如果用户选择一个项目,片段中的 TextView 应该改变颜色和文本。

适配器:

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

List<StaffMoreStoreList> StaffMoreStoreItems;
private Context context;
private SharedPreferences spStore;
private ArrayList<String> staffArray, initialsArray = new ArrayList<String>();
private View vDialogService;
private String staffArrayString, staffIdString;

public ServiceStaffAdapter(List<StaffMoreStoreList> StaffMoreStoreItems, Context context){
    super();
    this.StaffMoreStoreItems = StaffMoreStoreItems;
    this.context = context;
}


@Override
public ServiceStaffAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_staff_list, parent, false);
    ServiceStaffAdapter.ViewHolder viewHolder = new ServiceStaffAdapter.ViewHolder(v);

    SharedPreferences sp2= context.getSharedPreferences("STORE", Context.MODE_PRIVATE);
    staffArrayString = sp2.getString("staffArray","");
    staffArray = new ArrayList<String>();

    if(staffArrayString.equals("")){
        staffArray = new ArrayList<String>();

    }else{
        String replace = staffArrayString.replace("[","");
        String replace1 = replace.replace("]","");
        List<String> arrayList = new ArrayList<String>    (Arrays.asList(replace1.split(",")));
        staffArray = new ArrayList<String>();
        for(String fav:arrayList){
            staffArray.add(String.valueOf(fav.trim()));
        }
    }
    //array of string for staffs selected
    return viewHolder;
}


@Override
public void onBindViewHolder(final ServiceStaffAdapter.ViewHolder holder, int position) {

    final StaffMoreStoreList staffMoreStoreList =  StaffMoreStoreItems.get(position);

    holder.tvStaffName.setText(staffMoreStoreList.getStaffName());


    StaffMoreStoreItems.get(position).getStaffId();
    Log.e("staffArray size", String.valueOf(staffArray.size()));
    Log.e("staff array", staffArray.toString());
    staffIdString = staffMoreStoreList.getStaffId();
    //pre-select staffs    
    if(staffArray.contains(StaffMoreStoreItems.get(position).getStaffId())){
        holder.profile_image.setBorderColor(ContextCompat.getColor(context, R.color.primary));

    }else{
        holder.profile_image.setBorderColor(ContextCompat.getColor(context, R.color.transparent));
    }

    holder.cardStaff.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(staffArray.contains(staffMoreStoreList.getStaffId())){
                holder.profile_image.setBorderColor(ContextCompat.getColor(context, R.color.transparent));
                staffArray.removeAll(Collections.singleton(staffMoreStoreList.getStaffId()));

            }else{
                holder.profile_image.setBorderColor(ContextCompat.getColor(context, R.color.primary));
                staffArray.add(staffMoreStoreList.getStaffId());

            }

            spStore = context.getSharedPreferences("STORE", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor1 = spStore.edit();
            editor1.putString("staffArray", staffArray.toString());           
            editor1.commit();

        }
    });
}

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

class ViewHolder extends RecyclerView.ViewHolder  {

    private TextView tvStaffName;
    private CardView cardStaff;
    private CircleImageView profile_image;
    private ViewHolder(View itemView) {
        super(itemView);

        tvStaffName = (TextView) itemView.findViewById(R.id.tvStaffName);
        cardStaff = (CardView) itemView.findViewById(R.id.cardStaff);
        profile_image = (CircleImageView) itemView.findViewById(R.id.profile_image);
    }
  }
} 

单击适配器中的 CardViews 时,我想更改包含 RecyclerView 的片段中的 TextView。 TextView 会随着 staffArray 的大小而改变。

【问题讨论】:

    标签: android android-fragments android-recyclerview android-adapter


    【解决方案1】:

    在你的适配器里面复制这个。创建一个接口来执行 onClick。

    public interface OnClickListner {
    void setOnItemClick(int postion, View view);
    

    }

    然后在你的适配器中创建一个实例OnClickListner onClickListner ;

    然后创建一个setter public void setOnClickListner(OnClickListner onClickListner ) { this.onClickListner = onClickListner ; }

    现在在 OnBind 中

    holder.myview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onClickListner .setOnItemClick(position,view);
        }
    });
    

    然后在你的片段中粘贴这些。

    adapter.setOnClickListner(this);
    

    它们会出现错误,但是那里的鼠标会要求您执行 onclick, 实现方法并在片段中做任何你想做的事情,

    【讨论】:

    • 感谢您的快速回复,我已按照您的步骤操作,但在最后一步我无法解决方法 .setOnClickListner()
    • 在适配器中,您必须为 onclick 创建一个设置器。适配器.yourSetterMethod(this);
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    相关资源
    最近更新 更多