expandableList下的TextView消失



当ListView的数据列表不多的时候,可以很好的看到TextView。但是,当有大量数据并且列表充满屏幕时,TextView书面测试就会消失。请看下面的图片在此处输入图像描述

在此处输入图像描述

这是代码源。https://github.com/hardcodingJeon/ExpandList_recyclerView

谢谢!

MainActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.widget.ExpandableListView;
import java.util.ArrayList;
public class MainActivity extends Activity {
private ExpandableListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Display newDisplay = getWindowManager().getDefaultDisplay();
int width = newDisplay.getWidth();
ArrayList<GroupItem> DataList = new ArrayList<>();
listView = (ExpandableListView)findViewById(R.id.mylist);
for (int i=1;i<25;i++) {
GroupItem temp = new GroupItem("A"+i);
temp.childItems.add(new GroupItem.ChildItem("1","2"));
temp.childItems.add(new GroupItem.ChildItem("2","3"));
temp.childItems.add(new GroupItem.ChildItem("4","5"));
DataList.add(temp);
}

ExpandAdapter adapter = new ExpandAdapter(getApplicationContext(), R.layout.group_row, R.layout.activity_child, DataList);
listView.setIndicatorBounds(width - 50, width); 
listView.setAdapter(adapter);
}
}

ExpandAdapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;

public class ExpandAdapter extends BaseExpandableListAdapter {
private Context context;
private int groupLayout = 0;
private int chlidLayout = 0;
private ArrayList<GroupItem> DataList;
private LayoutInflater myinf = null;
public ExpandAdapter(Context context,int groupLay,int chlidLay,ArrayList<GroupItem> DataList){
this.context = context;
this.groupLayout = groupLay;
this.chlidLayout = chlidLay;
this.DataList = DataList;
this.myinf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
convertView = myinf.inflate(this.groupLayout, parent, false);
}
TextView groupName = (TextView)convertView.findViewById(R.id.groupName);
groupName.setText(DataList.get(groupPosition).groupTitle);
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView == null){
convertView = myinf.inflate(this.chlidLayout, parent, false);
}
RecyclerView recyclerView = convertView.findViewById(R.id.recyclerView);
RecyclerAdapter recyclerAdapter = new RecyclerAdapter(context,DataList.get(groupPosition).childItems);
LinearLayoutManager mManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(mManager);
recyclerView.setAdapter(recyclerAdapter);
return convertView;
}

@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return DataList.get(groupPosition).childItems.get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childPosition;
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return 1;
}
@Override
public GroupItem getGroup(int groupPosition) {
// TODO Auto-generated method stub
return DataList.get(groupPosition);
}
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return DataList.size();
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
}

GroupItem.java

import java.util.ArrayList;
public class GroupItem {
public String groupTitle;
public ArrayList<ChildItem> childItems = new ArrayList<>();
public GroupItem(String groupTitle) {
this.groupTitle = groupTitle;
}
public static class ChildItem {
String beforePrice;
String afterPrice;
public ChildItem(String beforePrice, String afterPrice) {
this.beforePrice = beforePrice;
this.afterPrice = afterPrice;
}
}
}

RecyclerAdapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class RecyclerAdapter extends RecyclerView.Adapter {
Context context;
ArrayList<GroupItem.ChildItem> items;
public RecyclerAdapter(Context context, ArrayList<GroupItem.ChildItem> items) {
this.context = context;
this.items = items;
}
//뷰id를 참조함
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View itemView = inflater.inflate(R.layout.child_item,parent,false);  
VH holder = new VH(itemView);
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
VH vh = (VH)holder; 

GroupItem.ChildItem item = items.get(position);

vh.beforePrice.setText( item.beforePrice );
vh.afterPrice.setText( item.afterPrice );
}
@Override
public int getItemCount() {
return items.size();
}
class VH extends RecyclerView.ViewHolder{
TextView beforePrice;
TextView afterPrice;
Button btn;
public VH(@NonNull View itemView) {
super(itemView);
beforePrice = itemView.findViewById(R.id.child_item_beforePrice);
afterPrice = itemView.findViewById(R.id.child_item_afterPrice);
btn = itemView.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, items.get(getLayoutPosition()).beforePrice+"n"+items.get(getLayoutPosition()).afterPrice, Toast.LENGTH_SHORT).show();
}
});
}
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="15dp">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indicatorRight="?android:attr/expandableListPreferredItemIndicatorRight"
android:id="@+id/mylist" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TEST"
android:textSize="20sp"/>
</LinearLayout>
</ScrollView>

</LinearLayout>

activity_child.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

child_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="8dp"
app:contentPaddingTop="4dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
<RelativeLayout
android:layout_width="250dp"
android:layout_height="wrap_content"
android:padding="15dp">
<TextView
android:id="@+id/child_item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="월간유니콘nPLUS 31"
android:textColor="@color/black"
android:textSize="20sp"
android:layout_centerHorizontal="true"
android:gravity="center"/>
<TextView
android:id="@+id/child_item_period"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1 개월간 매일 2회"
android:layout_below="@id/child_item_title"
android:layout_centerHorizontal="true"
android:layout_marginTop="15dp"/>
<LinearLayout
android:id="@+id/child_item_Linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/child_item_period"
android:orientation="vertical"
android:layout_marginTop="10dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="정기구독"
android:layout_below="@id/child_item_period"/>
<!--data-->
<TextView
android:id="@+id/child_item_beforePrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="62000원"/>
<!--data-->
<TextView
android:id="@+id/child_item_afterPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="29000/월"/>
</LinearLayout>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="구매"
android:layout_toRightOf="@id/child_item_Linear"
android:layout_below="@id/child_item_period"
android:layout_marginLeft="30dp"
android:layout_marginTop="15dp"
/>

</RelativeLayout>

</androidx.cardview.widget.CardView>

child_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/childName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25dip"
android:paddingLeft="40dip"
/>
<CheckBox
android:textColor="#111111"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New CheckBox"
android:id="@+id/checkBox" />
</LinearLayout>

group_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/groupName"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="20dp"
android:paddingLeft="5px"
android:textColor = "#FFA500"
/>
</LinearLayout>

您已经将ExpandableListView的高度设置为换行内容。因此,当元素数量增加时,它会将TextView推到可用屏幕下方。我建议1.使用ConstraintLayout或RelativeLayout2.将TextView粘贴在最底部,然后相对于排列您的可扩展列表视图

否则,将ExpandableListView的高度设置为一个特定的预定值(不建议(,它应该可以完美地工作

最新更新