单击文本时,更改片段内RecyclerView内每个项目的视图可见性

时间:2017-11-09 16:28:18

标签: android android-recyclerview adapter visibility

我有一个片段,其中包含一个带有退出按钮的布局标题,标题文本和可点击的编辑文本。

在标题布局下面,我有一个与宽度和高度的父布局匹配的RecyclerView。

enter image description here

RecyclerView的每一行都有一个ImageView,一个标题文本,一个描述文本,一个价格文本和一个用于从Recycler中删除该项目的不可见ImageView。

enter image description here

因为我的EDIT TextView是在Fragment中声明的,所以我无法在适配器中获取ViewHolder,以便像这样更改ImageView的可见性:

enter image description here

我想要的是在按下EDIT文本时为每行显示图像。

这是Adapter和ViewHolder代码:

public class BagItemsAdapter extends RecyclerView.Adapter<BagItemsAdapter.BagViewHolder> {

private List<BagItem> mBagList;
private Context mContext;
private String quantityPrefix, pricePrefix;

public BagItemsAdapter(Context context,List<BagItem> list)
{
    this.mBagList = list;
    this.mContext = context;
}

@Override
public BagViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.bag_shop_item_layout,parent,false);

    return new BagViewHolder(v);
}

@Override
public void onBindViewHolder(BagViewHolder holder, int position) {

    BagItem currentItem = mBagList.get(position);
    Picasso.with(mContext).load(currentItem.getItemImageUrl()).into(holder.bagItemImage);
    holder.bagItemTitleBrand.setText(currentItem.getItemBrandTitle());
    holder.bagItemDescription.setText(currentItem.getItemDescription());

    holder.removeBagItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

}


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

class BagViewHolder extends RecyclerView.ViewHolder{

    @BindView(R.id.bag_item_image) ImageView bagItemImage;
    @BindView(R.id.remove_bag_item) ImageView removeBagItem;
    @BindView(R.id.bag_item_title_brand) TextView bagItemTitleBrand;
    @BindView(R.id.bag_item_description) TextView bagItemDescription;
    @BindView(R.id.bag_item_quantity) TextView bagItemQuantity;
    @BindView(R.id.bag_item_price) TextView bagItemPrice;
    @BindView(R.id.bag_item_product) TextView bagItemProduct;


    public BagViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this,itemView);
    }
                }
              }

片段代码:

public class BagFragment extends Fragment implements BagView {

@BindView(R.id.bag_items_recycler)RecyclerView mRecycler;
@BindView(R.id.edit_bag_items_text)TextView editBagItems;
@BindView(R.id.exit_bag_image)ImageView exitBagImage;
@BindView(R.id.no_items_in_bag_image)ImageView noItemsImage;
@BindView(R.id.no_items_in_bag_text)TextView noItemsText;
@BindView(R.id.my_bag_title_text)TextView myBagTitleText;
@BindView(R.id.check_out_button)Button checkOutButton;

BagPresenter mPresenter;
ItemTouchHelper itemTouchHelper;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPresenter = new BagPresenter(getActivity(),this);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.shopping_bag_fragment_layout,container,false);
    ButterKnife.bind(this,v);
    mPresenter.getBagItems();
    return v;
}



@OnClick({R.id.exit_bag_image,R.id.edit_bag_items_text,R.id.check_out_button})
public void onBagViewsClicked(View v)
{
    switch (v.getId())
    {
        case R.id.exit_bag_image:
            getActivity().getSupportFragmentManager().popBackStack();
            break;
        case R.id.edit_bag_items_text:
            if(editBagItems.getText().equals(getActivity().getResources().getString(R.string.edit_string)))
            {
             editBagItems.setText(getActivity().getResources().getString(R.string.done_string));
                editBagItems.setTypeface(Typeface.DEFAULT_BOLD);
                //TODO here is where I should make the delete ImageView visible for each item
          ((BagItemsAdapter)mRecycler.getAdapter()).showDeleteImage(); "this does not work because i can't get the ViewHolder from the adapter"
            }else if(editBagItems.getText().equals(getActivity().getResources().getString(R.string.done_string)))
            {
                editBagItems.setText(getActivity().getResources().getString(R.string.edit_string));
                editBagItems.setTypeface(Typeface.DEFAULT);
                //TODO here is where I should hide the delete ImageView
              ((BagItemsAdapter)mRecycler.getAdapter()).hideDeleteImage(); "this does not work"
            }


            }
    }
}

非常感谢任何帮助! :)

2 个答案:

答案 0 :(得分:2)

首先,您需要向BagItem添加新属性。我们称之为editMode

class BagItem {
    boolean editMode;
}

最初editMode是假的。当用户按下编辑按钮时,您需要将editMode更改为true。确保您的mBagList设置为公开。接下来,您需要通知Recycler视图适配器数据已更改。

for (BagItem bagItem: bagItemsAdapter.mBagList) {
    bagItem.editMode = true;
}
bagItemsAdapter.notifyDataSetChanged();

您还需要根据removeBagItem值更新editMode的可见性。

holder.removeBagItem.setVisibility(currentItem.editMode ? View.VISIBLE : View.GONE);

答案 1 :(得分:0)

  1. 首先在适配器类中创建一个布尔全局变量,例如。

    private boolean isVisible = false;
    
  2. 根据该变量设置onBindViewHolder中imageview的可见性,例如

    if(isVisible){
      holder.removeBagItem.setVisibility(View.VISIBLE);
    }else{
      holder.removeBagItem.setVisibility(View.GONE);
    }
    
  3. 在公共方法上创建,例如在适配器中设置imageView的可见性

    public void setVisibility(){
      isVisible = true;
      this.notifyDataSetChanged();
    }
    
  4. 从片段编辑文本中单击调用该适配器方法,例如。

    adapter.setVisibility();