Android:RecyclerView 行可见性无法正常工作
Android : RecyclerView row Visibility not working properly
我正在开发 android 应用程序 (Android Studio)。我想在每一行中实现 Visibility
GONE/VISIBLE 。图像中有三 recyclerView
行,
我想做以下事情:
每行有两部分标题 & 详情.
- 当此 Activity 打开所有行详细信息时应隐藏。
- 当我单击特定行时,该行的详细信息应显示为
能见度 VISIBLE.
当我再次单击行详细信息时,Visibility GONE 应该会消失。
问题是:如果我点击第一行,会显示第一行的详细信息并且
单击下一个任意行标题时不隐藏第一行的详细信息。我有
单击两次以显示下一行的详细信息或隐藏详细信息
下一行。
Image One Here
Image Two Here
适配器代码:
int i = 0;
holder.salt_head_ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
if (i % 2 == 1) {
holder.have_show_ll.setVisibility(View.VISIBLE);
holder.l1_arrow.setImageResource(R.drawable.down_arrow_black);
} else if (i % 2 == 0) {
holder.have_show_ll.setVisibility(View.GONE);
holder.l1_arrow.setImageResource(R.drawable.right_arrow_black);
}
}
});
这是我的建议,不要使用 RecyclerView
,你必须尝试 ExpandableListView
。 ExpandableListView
的示例是 here,如果您想要列表中的单个 child,则设置:
@Override
public int getChildrenCount(int groupPosition) {
return 1;
}
这里是你如何在没有扩展 listView 的情况下实现它
您的卡片或 itemView 将类似于
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:id="@+id/tvTitle"
/>
<!--this is your detail view layout, modify it accordingly-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/detail"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp"
android:text="detail goes here\n and here\n and here"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#747474"/>
</LinearLayout>
您的适配器
public class SecondAdapter extends RecyclerView.Adapter<SecondAdapter.ViewHolder>{
private List<TextBean> data;
private Context context;
public SecondAdapter(Context context, List<TextBean> data){
this.context = context;
this.data = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.card_second, parent , false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final TextBean textBean = data.get(position);
holder.title.setText(textBean.getTitle());
if(textBean.isVisibility())
holder.detailLayout.setVisibility(View.VISIBLE);
else
holder.detailLayout.setVisibility(View.GONE);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(textBean.isVisibility()){
textBean.setVisibility(false);
holder.detailLayout.setVisibility(View.GONE);
notifyDataSetChanged();
}else{
textBean.setVisibility(true);
holder.detailLayout.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
}
});
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView title;
public LinearLayout detailLayout;
public ViewHolder(View item){
super(item);
title = (TextView)item.findViewById(R.id.tvTitle);
detailLayout = (LinearLayout) item.findViewById(R.id.detail);
}
}
}
你的豆子class
我只考虑了标题,您也可以在此处添加详细信息
public class TextBean {
private String title;
private boolean visibility; // donot forget this, this is to handle visibility
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isVisibility() {
return visibility;
}
public void setVisibility(boolean visibility) {
this.visibility = visibility;
}
}
如何将其附加到 RecyclerView
public class SecondActivity extends AppCompatActivity {
List<TextBean> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
populatedata(); // populate your data here
SecondAdapter secondAdapter = new SecondAdapter(this,data);
recyclerView.setAdapter(secondAdapter);
}
public void populatedata(){
int count = 1;
TextBean textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false); // keep them false in beginning
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
}
}
这是完整的解决方案。有什么疑问可以问
首先按照以下步骤为您的适配器创建一个点击监听器:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
@Override
public void onClick(View view) {
if (clicklistener != null) {
clicklistener.itemClicked("adapter intials", view, getAdapterPosition());
}
}
}
public void setClickListener(RecycleListener clicklistener) {
this.clicklistener = clicklistener;
}}
创建接口class:
// interface designed to handle list view click events
public interface RecycleListener {
// adapterPage argument for identifying the adapter it is clicked from.
void itemClicked(String adapterPage, View view, int position);
// public void selfItemClicked(View view, int position);
}
然后在你的 activity 中使用这个 RecycleListener 实现
它会给你覆盖方法
@Override
public void itemClicked(final String adapterType, View view, final int position) {
//here control visibility of your layout using position and view
// find your view using this view
}
尝试在代码中添加一个标志,并基于该标志在 onBindViewHolder 中添加可见性逻辑。
@Override
public void onBindViewHolder(@NonNull final ProductViewHolder holder, final int position) {
holder.linearLayoutItemButton.setVisibility(canShow(productOrderList.get(position))?
View.VISIBLE : View.GONE);
holder.addButton.setVisibility(canShow(productOrderList.get(position))?
View.GONE : View.VISIBLE);
我正在开发 android 应用程序 (Android Studio)。我想在每一行中实现 Visibility
GONE/VISIBLE 。图像中有三 recyclerView
行,
我想做以下事情:
每行有两部分标题 & 详情.
- 当此 Activity 打开所有行详细信息时应隐藏。
- 当我单击特定行时,该行的详细信息应显示为 能见度 VISIBLE.
当我再次单击行详细信息时,Visibility GONE 应该会消失。
问题是:如果我点击第一行,会显示第一行的详细信息并且 单击下一个任意行标题时不隐藏第一行的详细信息。我有 单击两次以显示下一行的详细信息或隐藏详细信息 下一行。
Image One Here
Image Two Here
适配器代码:
int i = 0;
holder.salt_head_ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
if (i % 2 == 1) {
holder.have_show_ll.setVisibility(View.VISIBLE);
holder.l1_arrow.setImageResource(R.drawable.down_arrow_black);
} else if (i % 2 == 0) {
holder.have_show_ll.setVisibility(View.GONE);
holder.l1_arrow.setImageResource(R.drawable.right_arrow_black);
}
}
});
这是我的建议,不要使用 RecyclerView
,你必须尝试 ExpandableListView
。 ExpandableListView
的示例是 here,如果您想要列表中的单个 child,则设置:
@Override
public int getChildrenCount(int groupPosition) {
return 1;
}
这里是你如何在没有扩展 listView 的情况下实现它
您的卡片或 itemView 将类似于
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:id="@+id/tvTitle"
/>
<!--this is your detail view layout, modify it accordingly-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/detail"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp"
android:text="detail goes here\n and here\n and here"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#747474"/>
</LinearLayout>
您的适配器
public class SecondAdapter extends RecyclerView.Adapter<SecondAdapter.ViewHolder>{
private List<TextBean> data;
private Context context;
public SecondAdapter(Context context, List<TextBean> data){
this.context = context;
this.data = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.card_second, parent , false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final TextBean textBean = data.get(position);
holder.title.setText(textBean.getTitle());
if(textBean.isVisibility())
holder.detailLayout.setVisibility(View.VISIBLE);
else
holder.detailLayout.setVisibility(View.GONE);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(textBean.isVisibility()){
textBean.setVisibility(false);
holder.detailLayout.setVisibility(View.GONE);
notifyDataSetChanged();
}else{
textBean.setVisibility(true);
holder.detailLayout.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
}
});
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView title;
public LinearLayout detailLayout;
public ViewHolder(View item){
super(item);
title = (TextView)item.findViewById(R.id.tvTitle);
detailLayout = (LinearLayout) item.findViewById(R.id.detail);
}
}
}
你的豆子class 我只考虑了标题,您也可以在此处添加详细信息
public class TextBean {
private String title;
private boolean visibility; // donot forget this, this is to handle visibility
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isVisibility() {
return visibility;
}
public void setVisibility(boolean visibility) {
this.visibility = visibility;
}
}
如何将其附加到 RecyclerView
public class SecondActivity extends AppCompatActivity {
List<TextBean> data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
populatedata(); // populate your data here
SecondAdapter secondAdapter = new SecondAdapter(this,data);
recyclerView.setAdapter(secondAdapter);
}
public void populatedata(){
int count = 1;
TextBean textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false); // keep them false in beginning
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
textBean = new TextBean();
textBean.setTitle("Title"+count);
textBean.setVisibility(false);
data.add(textBean);
count++;
}
}
这是完整的解决方案。有什么疑问可以问
首先按照以下步骤为您的适配器创建一个点击监听器:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
@Override
public void onClick(View view) {
if (clicklistener != null) {
clicklistener.itemClicked("adapter intials", view, getAdapterPosition());
}
}
}
public void setClickListener(RecycleListener clicklistener) {
this.clicklistener = clicklistener;
}}
创建接口class:
// interface designed to handle list view click events
public interface RecycleListener {
// adapterPage argument for identifying the adapter it is clicked from.
void itemClicked(String adapterPage, View view, int position);
// public void selfItemClicked(View view, int position);
}
然后在你的 activity 中使用这个 RecycleListener 实现 它会给你覆盖方法
@Override
public void itemClicked(final String adapterType, View view, final int position) {
//here control visibility of your layout using position and view
// find your view using this view
}
尝试在代码中添加一个标志,并基于该标志在 onBindViewHolder 中添加可见性逻辑。
@Override
public void onBindViewHolder(@NonNull final ProductViewHolder holder, final int position) {
holder.linearLayoutItemButton.setVisibility(canShow(productOrderList.get(position))?
View.VISIBLE : View.GONE);
holder.addButton.setVisibility(canShow(productOrderList.get(position))?
View.GONE : View.VISIBLE);