Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 回收器视图可重复使用视图固定器。如何保持特定位置项目的可见性?_Android_Android Recyclerview_Android Viewholder - Fatal编程技术网

Android 回收器视图可重复使用视图固定器。如何保持特定位置项目的可见性?

Android 回收器视图可重复使用视图固定器。如何保持特定位置项目的可见性?,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,这是一个关于在特定位置重复按钮视图的问题的答案。代码运行良好。我的疑问是,即使在recyclerview中滚动后,如何保持第一项的可见性 class MyViewHolder extends RecyclerView.ViewHolder { TextView message; Button button; public MyViewHolder(View itemView) { super(itemView);

这是一个关于在特定位置重复按钮视图的问题的答案。代码运行良好。我的疑问是,即使在recyclerview中滚动后,如何保持第一项的可见性

 class MyViewHolder extends RecyclerView.ViewHolder {
        TextView message;
        Button button;
        public MyViewHolder(View itemView) {
            super(itemView);
            message = (TextView) itemView.findViewById(R.id.message);
            button = (Button) itemView.findViewById(R.id.button);
        }
    }
并将其放置在适配器的方法onBindViewHolder中:

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    holder.button.setVisibility(View.GONE);        
    holder.message.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.button.setVisibility(View.VISIBLE);
        }
    });
}

设置与每个项关联的布尔变量数组

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

    if(visibilityList.get(position)){
        holder.button.setVisibility(View.VISIBLE); 
    }else{
        holder.button.setVisibility(View.GONE); 
    }

    holder.message.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(visibilityList.get(position)){
                visibilityList.set(position, false);
                holder.button.setVisibility(View.GONE);
            }else{
                visibilityList.set(position, true);
                holder.button.setVisibility(View.VISIBLE);
            }

        }
    });
}

注意:visibilityList是列表变量,其中每个值都设置为默认值(根据您的要求为true或false)

使用HashMap保留需要显示的位置。在
onBindViewHolder
方法中写入代码

if(map.contains(holder.getAdapterPosition()){
    holder.btn.setVisibility(View.VISIBLE);
} else {
    holder.btn.setVisibility(View.GONE);
}

注意:-也要编写else case,否则由于可重用性,recyclerView将行为不端

我假设在适配器中,您持有一个表示要显示的项目的对象数组

向该对象添加一个名为“例如
ButtonVisible
的属性,并在按下按钮时设置该属性

下面是完整的适配器示例。这将显示带有按钮的项目列表,当按下按钮时,该按钮将不可见。无论列表中有多少项或滚动多少项,可见性都会被记住

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> {

public static class MyData {
    public boolean ButtonVisible = true;
    public String Text;

    public MyData(String text) {
        Text = text;
    }
}

public List<MyData> items = new ArrayList<>();

public TestAdapter() {
    this.items.add(new MyData("Item 1"));
    this.items.add(new MyData("Item 2"));
    this.items.add(new MyData("Item 3"));
}

@Override
public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) {
    return new VH((
            LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.test_layout, parent, false))
    );
}

@Override
public void onBindViewHolder(TestAdapter.VH holder, final int position) {
    final MyData itm = items.get(position);

    holder.button.setVisibility(itm.ButtonVisible ? View.VISIBLE : View.GONE);
    holder.text.setText(itm.Text);

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            itm.ButtonVisible = false;
            notifyItemChanged(position);
        }
    });

}

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

public class VH extends RecyclerView.ViewHolder {

    Button button;
    TextView text;

    public VH(View itemView) {
        super(itemView);
        button = itemView.findViewById(R.id.toggle);
        text = itemView.findViewById(R.id.text1);
    }
}
}
公共类TestAdapter扩展了RecyclerView.Adapter{
公共静态类MyData{
公共布尔按钮可视=真;
公共字符串文本;
公共MyData(字符串文本){
文本=文本;
}
}
public List items=new ArrayList();
公共测试适配器(){
添加(新MyData(“第1项”);
添加(新MyData(“第2项”);
添加(新MyData(“第3项”);
}
@凌驾
public TestAdapter.VH onCreateViewHolder(视图组父级,int-viewType){
返回新VH((
LayoutInflater.from(parent.getContext())
.充气(R.layout.test_layout,parent,false))
);
}
@凌驾
BindViewHolder上的公共无效(TestAdapter.VH holder,最终int位置){
最终MyData itm=items.get(位置);
holder.button.setVisibility(itm.ButtonVisible?View.VISIBLE:View.GONE);
holder.text.setText(itm.text);
holder.button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
itm.ButtonVisible=假;
(职位)变更;
}
});
}
@凌驾
public int getItemCount(){
返回items.size();
}
公共类VH扩展了RecyclerView.ViewHolder{
按钮;
文本查看文本;
公共VH(查看项目视图){
超级(项目视图);
button=itemView.findViewById(R.id.toggle);
text=itemView.findviewbyd(R.id.text1);
}
}
}
测试\u layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal">

    <Button
        android:id="@+id/toggle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>


您可以使用粘性标题进行此操作。看看这个:()我得到了你需要的东西!我想你需要理解给出的解释