Android ListView仅显示一行
我有一个简单的列表,它假设显示DB表中的所有行。但是,它在列表视图中仅显示一行 但是,它从DB接收所有行(验证configArrayList的大小),但仅显示第一行并丢弃其他行 下面是活动和自定义适配器 主要活动:Android ListView仅显示一行,android,listview,Android,Listview,我有一个简单的列表,它假设显示DB表中的所有行。但是,它在列表视图中仅显示一行 但是,它从DB接收所有行(验证configArrayList的大小),但仅显示第一行并丢弃其他行 下面是活动和自定义适配器 主要活动: ArrayList<HashMap<String, String>> configArrayList = dbTools.getAllConfig(); // Returns 4 rows ArrayList<ConfigEntity> confi
ArrayList<HashMap<String, String>> configArrayList = dbTools.getAllConfig(); // Returns 4 rows
ArrayList<ConfigEntity> configMenu = new ArrayList<>();
if (!(configArrayList.isEmpty()))
{
Iterator<HashMap<String, String>> iterator = configArrayList.iterator();
while (iterator.hasNext())
{
HashMap<String, String> configMap = iterator.next();
// ConfigEntity contains two members Name, ID and their setter, getter
ConfigEntity entity = new ConfigEntity();
entity.setID(configMap.get("ID"));
entity.setName(String.valueOf(configArrayList.size()));
// Set Name as Size to verify the list size is grater than 1. (Size is 4)
configMenu.add(entity);
}
}
if (!(configMenu.isEmpty()))
{
ListAdapter adapter = new ConfigListAdapter(this, configMenu);
ListView theListView = (ListView) findViewById(R.id.config_list_listView);
theListView.setAdapter(adapter);
}
ArrayList configArrayList=dbTools.getAllConfig();//返回4行
ArrayList configMenu=新建ArrayList();
if(!(configArrayList.isEmpty())
{
迭代器迭代器=configArrayList.Iterator();
while(iterator.hasNext())
{
HashMap configMap=iterator.next();
//ConfigEntity包含两个成员名称ID和它们的setter getter
ConfigEntity实体=新的ConfigEntity();
entity.setID(configMap.get(“ID”);
entity.setName(String.valueOf(configArrayList.size());
//将名称设置为大小以验证列表大小是否大于1。(大小为4)
configMenu.add(实体);
}
}
如果(!(configMenu.isEmpty())
{
ListAdapter=新配置ListAdapter(此,配置菜单);
ListView theListView=(ListView)findViewById(R.id.config\u list\u ListView);
设置适配器(适配器);
}
以下是自定义适配器:
public class ConfigListAdapter extends BaseAdapter {
private ArrayList<ConfigEntity> entityList;
private LayoutInflater layoutInflater;
public ConfigListAdapter(Context context, ArrayList<ConfigEntity> entityList) {
this.entityList = entityList;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return entityList.size();
}
@Override
public Object getItem(int position) {
return entityList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.config_list_row_layout, null);
holder = new ViewHolder();
holder.nameTextView = (TextView) convertView.findViewById(R.id.config_list_row_textView);
holder.idTextView = (TextView) convertView.findViewById(R.id.config_list_row_id);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ConfigEntity entity = entityList.get(position);
holder.nameTextView.setText(entity.getName());
holder.idTextView.setText(entity.getID());
return convertView;
}
static class ViewHolder {
TextView nameTextView;
TextView idTextView;
}
}
公共类ConfigListAdapter扩展了BaseAdapter{
私有ArrayList实体列表;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
公共ConfigListAdapter(上下文上下文,ArrayList entityList){
this.entityList=entityList;
layoutInflater=layoutInflater.from(上下文);
}
@凌驾
public int getCount(){
返回entityList.size();
}
@凌驾
公共对象getItem(int位置){
返回entityList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=LayoutFlater.充气(R.layout.config\u list\u row\u layout,null);
holder=新的ViewHolder();
holder.nameTextView=(TextView)convertView.findViewById(R.id.config\u list\u row\u TextView);
holder.idTextView=(TextView)convertView.findViewById(R.id.config\u list\u row\u id);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
ConfigEntity实体=entityList.get(位置);
holder.nameTextView.setText(entity.getName());
holder.idTextView.setText(entity.getID());
返回视图;
}
静态类视窗夹{
TextView名称TextView;
TextView idTextView;
}
}
main_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add New"
android:id="@+id/config_list_addConfig_button"
android:layout_gravity="right"
android:onClick="addNewConfig" />
<ListView
android:id="@+id/config_list_listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:dividerHeight="5dp">
</ListView>
</LinearLayout>
</ScrollView>
config_list_listView.xml
<?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="match_parent"
android:layout_marginLeft="@dimen/margin_20dp">
android:layout_marginRight="@dimen/margin_20dp">
<TextView
android:id="@+id/config_list_row_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_marginTop="@dimen/margin_10dp"
android:layout_marginLeft="@dimen/margin_20dp"
android:longClickable="true" />
<TextView
android:id="@+id/config_list_row_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
android:layout_marginRight=“@dimen/margin_20dp”>
请试试这个。
更改getView方法如下
@Override
public View getView(int position, View convertView, ViewGroup parent) {
view=convertView;
ViewHolder holder;
if (convertView == null) {
view = layoutInflater.inflate(R.layout.config_list_row_layout, null);
holder = new ViewHolder();
holder.nameTextView = (TextView) view.findViewById(R.id.config_list_row_textView);
holder.idTextView = (TextView) view.findViewById(R.id.config_list_row_id);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
ConfigEntity entity = entityList.get(position);
holder.nameTextView.setText(entity.getName());
holder.idTextView.setText(entity.getID());
return view;
}
并声明视图;作为类级变量;
希望对你有帮助,谢谢。请参阅此处:-可能我发现了您的问题,请尝试删除ScrollView中的listView表单。您不应该将ListView放在ScrollView中,因为ListView类实现了自己的滚动,并且不接收手势,因为它们都由父ScrollView处理
如果您想使用标题在列表顶部显示某些内容,只需使用
listView.addHeader(yourlayour)
,查看一下这个问题。如果(convertView==null),此代码将与“convertView.findViewById(R.id.config_list_row_textView);”上的NPE崩溃@0X0nosugar感谢您的更正,我编辑了上述帖子。@JagjitSingh不,它不会反映任何内容。请共享包含listview的xml,好吗?我知道您正在使用大小来确保您拥有数据,但是,当您将configMenu传递到列表时,您是否可以打印出configMenu中的内容,以100%确定问题不存在?@Spirrow理想情况下,configMenu应该具有相同的数据。然而,根据你的建议,我已经核实了清单中的数据。一切看起来都很好。(它包含ConfigEntity的对象列表,每个ConfigEntity对象保存从DB中的每一行获取的数据)。是否有理由将ListView放在ScrollView中?我认为这是不好的做法。getCount()在ConfigListAdapter中返回什么?@JasonSaruulo我理解您的担忧,我知道这一点。但我想在页面顶部的按钮,应该与列表内容滚动。如果我将列表从ScrollView中取出,它会将页面分成两部分,顶部一部分只包含按钮,底部一部分包含listView。因此,只有列表将滚动,按钮将是静态的,这是不期望的。不过,我们欢迎任何更好的方法来实现这一点。