我有一个片段,其中包含一个带有退出按钮的布局标题,标题文本和可点击的编辑文本。
在标题布局下面,我有一个与宽度和高度的父布局匹配的RecyclerView。
RecyclerView的每一行都有一个ImageView,一个标题文本,一个描述文本,一个价格文本和一个用于从Recycler中删除该项目的不可见ImageView。
因为我的EDIT TextView是在Fragment中声明的,所以我无法在适配器中获取ViewHolder,以便像这样更改ImageView的可见性:
我想要的是在按下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"
}
}
}
}
非常感谢任何帮助! :)
答案 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)
首先在适配器类中创建一个布尔全局变量,例如。
private boolean isVisible = false;
根据该变量设置onBindViewHolder中imageview的可见性,例如
if(isVisible){
holder.removeBagItem.setVisibility(View.VISIBLE);
}else{
holder.removeBagItem.setVisibility(View.GONE);
}
在公共方法上创建,例如在适配器中设置imageView的可见性
public void setVisibility(){
isVisible = true;
this.notifyDataSetChanged();
}
从片段编辑文本中单击调用该适配器方法,例如。
adapter.setVisibility();