【问题标题】:How to handle Recyclerview item in its own Activity to set visiblity?如何在自己的 Activity 中处理 Recyclerview 项目以设置可见性?
【发布时间】:2019-07-12 13:26:29
【问题描述】:

我的 ADAPTER 文件在这些文件中声明了布尔值和一个函数,即 setCheckboxVisibilityStatus(),如何在活动中调用该函数。如果我像 adapter.setCheckboxVisibilityStatus() 那样调用它会显示错误。

公共类 BrowseHuntSlideAdapter 扩展 RecyclerView.Adapter {

public LayoutInflater inflater;
private ArrayList<BrowseHuntSlideModel> dataModelArrayList;
Double lat, lng;
String address;

private boolean hideChkbox = false;

public static ArrayList<Object> mySelectPlace = new ArrayList<Object> ();
public static ArrayList<String> mySelectPlaceAdd = new ArrayList<> ();
public static ArrayList<String> mySelectplaceImg = new ArrayList<> ();
public static ArrayList<String> mySelectplaceDesc = new ArrayList<> ();
public BrowseHuntSlideAdapter(Context ctx, ArrayList<BrowseHuntSlideModel> dataModelArrayList) {

    inflater = LayoutInflater.from ( ctx );
    this.dataModelArrayList = dataModelArrayList;
    //this.mapboxMap = mapBoxMap;

}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = inflater.inflate ( R.layout.browse_slide_list_item, parent, false );
    MyViewHolder holder = new MyViewHolder ( view );

    return holder;
}

public void setCheckboxVisibilityStatus(boolean status) {
    hideChkbox = status;

    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(BrowseHuntSlideAdapter.MyViewHolder holder, int position) {


    if(hideChkbox)
        holder.checkBox.setVisibility(GONE); //Make it invisible instead of GONE if needed.
    else
        holder.checkBox.setVisibility(VISIBLE);

}

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

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView place_name, place_address, distance;
    ImageView place_image;
    Button button;
    CheckBox checkBox;

    public MyViewHolder(View itemView) {
        super ( itemView );
        Context context = itemView.getContext ();
        checkBox = (CheckBox)itemView.findViewById(R.id.checkbox);
        //place_address1 = (TextView) itemView.findViewById ( R.id.place_address );

    }

} }

还有我在活动中的编辑按钮......

公共类 Gotosafari 扩展了 AppCompatActivity 实现 OnMapReadyCallback, PermissionsListener {

String srno;
private RecyclerView rList, rList2;
private LinearLayoutManager linearLayoutManager;
private DividerItemDecoration dividerItemDecoration;
private static ArrayList<BrowseHuntSlideModel> PlacesList;
private RecyclerView.Adapter adapter, adapter1;

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

    rList = (RecyclerView) findViewById(R.id.recycle_slide_list);
    PlacesList = new ArrayList<>();
    adapter = new BrowseHuntSlideAdapter(getApplicationContext(),PlacesList);
    linearLayoutManager = new LinearLayoutManager(this); 
  linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    dividerItemDecoration = new 
    DividerItemDecoration(rList.getContext(), 
    linearLayoutManager.getOrientation());
    rList.setLayoutManager(new LinearLayoutManager(this, 
    LinearLayoutManager.VERTICAL, false));
    rList.addItemDecoration(dividerItemDecoration);
    rList.setAdapter(adapter);


    Button edtbtn = (Button) findViewById(R.id.edtbtn);
    Button donebtn = (Button) findViewById(R.id.donebtn);
    donebtn.setVisibility(View.INVISIBLE);

    edtbtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            edtbtn.setVisibility(View.INVISIBLE);
            donebtn.setVisibility(View.VISIBLE);
            edtbtn.setText("EDIT");
            adapter.setCheckBoxVisibilityStatus(true);
        }
    });

    donebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            donebtn.setVisibility(View.INVISIBLE);
            edtbtn.setVisibility(View.VISIBLE);
            donebtn.setText("DONE");

            flagtrue= "false";
            adapter.notifyDataSetChanged();
            mySelectPlaceAdd.clear();
            mySelectplaceDesc.clear();
       }
    });
    addFirstStopToStopsList ();
}

【问题讨论】:

  • 可以通过接口重定向到Activity。链接:stackoverflow.com/questions/49969278/…
  • 检查我的答案..
  • 你到底想达到什么目的.. 全选功能?在这种情况下,您应该更新模型并调用 notifydatasetchanged ... 如果您仍然希望在活动中处理您的 checkchange 侦听器.. 创建一个接口并将其传递给适配器,以便您可以调用回调...甚至发送更好的更高订单功能..

标签: android


【解决方案1】:

在您的适配器中,创建一个这样的接口:

public interface ListAction {
    public void onCheckBoxClick(int position);
}

然后,点击您的复选框如下:

        holder.your_check_box.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    listAction.onCheckBoxClick(position);
                }
            }
        });

然后,在您的 Activity 中实现该接口并覆盖它的方法:

class YourActivity implements YouAdapterClass.ListAction

并覆盖它的方法如下:

    @Override
    public void onCheckBoxClick(int position){
    //Do Whatever you want here..
    }

简单..!!

编辑

还可以通过构造函数将监听器从您的 Activity 传递给 Adapter 类,如下所示:

mAdapter = new YouAdapterClass(getActivity(),this);

this - 第二个参数。

并且在您的适配器类中执行以下操作:

//Declare

private YourAdapterClass.ListAction listAction;

//Constructor

public YourAdapterClass(Context mContext, YourAdapterClass.ListAction listAction) {
        this.mContext = mContext;
        this.listAction = listAction;
    }

【讨论】:

  • 谢谢。但我只想在按钮单击时设置复选框的可见性,并且我的按钮处于活动状态,而复选框在 Recycler 视图列表中意味着在适配器中。那么如何从活动中设置它?
  • 只使用模型类兄弟。在模型类中取一个单独的变量并将布尔值存储在其中。如果它是真的设置可见,否则设置不可见。单击复选框检查它,然后在上述方法中通知您的适配器,该方法在活动中(被覆盖) - yourAdapter.notifyDataSetChanged()。
  • 我的活动中有一个编辑按钮。和复选框在我的 recyclerview 列表中,意味着在适配器中。当我单击编辑按钮时,所有复选框都设置为可见。所以请告诉我怎么做?
  • 你创建了一个模型类吗?如果是,那么请。将其发布在您的问题中。我会指导如果它仍然悬而未决。
【解决方案2】:

在回收器视图适配器中创建一个方法,如 public void hideCheckBox(); 在该方法中,通过标记获取该复选框视图并将其隐藏。 您必须将标签添加到要隐藏的复选框。 您可以从 Activity 调用该方法,因为您拥有适配器实例。

例如,

在您的适配器中,方法类似于,

public void hideCheckBox(){
  //get view by tag and hide it
  notifyDataSetChanged();
}

现在假设你的适配器名称是 mAdapter,

 edtbtn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        edtbtn.setVisibility(View.INVISIBLE);
        donebtn.setVisibility(View.VISIBLE);
        edtbtn.setText("EDIT");

   // want to apply code here.
     mAdapter.hideCheckBox();
    }
});

【讨论】:

  • 如何在活动中调用该方法。如果你有任何参考,请告诉我
  • 检查我的编辑希望会有所帮助。如果不告诉我。
  • 我的活动中有一个编辑按钮。和复选框在我的 recyclerview 列表中,意味着在适配器中。当我单击编辑按钮时,所有复选框都设置为可见。所以请告诉我怎么做?
  • 如果我错了,请纠正我 - 所以在 recyclerview 中只有复选框存在,当用户单击编辑按钮(处于活动状态)时,所有复选框都应该可见或不可见,对吗?
  • 在活动中调用方法显示错误。如何在activity中调用适配器方法
【解决方案3】:

当您说隐藏...时,您想一次隐藏所有复选框...吗?如果是,则在您的适配器中创建一个布尔标志并最初将其设置为 true。然后创建一个 setter 方法,您可以在其中将其设置为 false 和 notifyDataSetChanged 稍后从活动中...在onBindViewHolder 方法中,您应该设置比较该标志的复选框的可见性..

如果您想隐藏列表中的某些复选框而不是所有复选框.. 您应该在数据模型中拥有该标志,然后稍后对其进行更改并将notifyItemChanged 调用到这些特定项目...

【讨论】:

    【解决方案4】:

    将适配器类中的标志变量作为类变量。

    private int boolean hideChkbox = false; //false intially so that it will show open adapter created.
    

    现在在适配器中创建一个方法。

    public void setCheckboxVisibilityStatus(boolean status) {
        hideChkbox = status;
    
        notifyDataSetChanged();
    }
    

    现在您需要做的是在 onBindViewHolder() 方法中添加条件以使复选框可见或隐藏。所以代码 sn -p 将是-

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        if(hideChkbox)
            holder.chkbox.setVisibility(GONE) //Make it invisible instead of GONE if needed.
        else
            holder.chkbox.setVisibility(VISIBLE)
    
        //Note don't forget to put both if-else condition above otherwise irrelevant result may be seen while scrolling.
    
        ..... add your rest of code logic here
    }
    

    接下来,当您想要更改适配器类中的可见性时,您需要从您的活动中调用此方法。如果需要隐藏,则将 true 作为方法参数传递,否则为 false。所以来自 Activity 的调用将是-

    edtbtn.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            edtbtn.setVisibility(View.INVISIBLE);
            donebtn.setVisibility(View.VISIBLE);
            edtbtn.setText("EDIT");
    
            // want to apply code here.
            adapter.setCheckboxVisibilityStatus(true);
        }
    });
    

    希望它能解决问题。

    【讨论】:

    • adapter. setCheckboxVisibilityStatus(true) 它显示错误它没有从适配器调用函数
    • 如何在activity中调用该方法
    • 使用您可能在 Activity 中创建的适配器变量。
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2022-01-18
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多