getView() 在我的自定义列表视图中不起作用
Posted
技术标签:
【中文标题】getView() 在我的自定义列表视图中不起作用【英文标题】:getView() does not work in my Custom List View 【发布时间】:2020-08-28 14:18:48 【问题描述】:我的问题是我的 listView 没有显示任何项目。我在我的 SQLite 数据库中输入了多列数据,我想在自定义列表视图中显示它,但我的列表视图没有显示任何内容。我认为问题出在我的自定义适配器中,特别是在 getView() 方法中。我使用日志消息跟踪数据流,并将数据库中存储的数据存储到 ArrayList 中,但似乎 getView() 没有将值放入 TextView。我尝试了很多教程,但它不断让我制作自定义数据类并更改我的漏洞代码。请帮我。这个问题我已经困扰了好几个星期了。
我的自定义适配器ListAdapter
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class ListAdapter extends ArrayAdapter<String>
private final Activity context;
private final ArrayList<String> items;
public ListAdapter(Activity context, ArrayList<String> items)
super(context, R.layout.custom_list, items);
// TODO Auto-generated constructor stub
this.context=context;
this.items=items;
@Override
public int getCount()
return items.size();
public View getView(int position, View view, ViewGroup parent)
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.custom_list, null,true);
TextView nameTV = rowView.findViewById(R.id.nameTV);
TextView priceTV = rowView.findViewById(R.id.priceTV);
//nameTV.setText(names[position]);
//priceTV.setText(prices[position].toString());
nameTV.setText(items.get(2*position));
priceTV.setText(items.get(2*position+1));
Log.d("ListAdapter", "nameTV.setText: items.get(2*position) "+nameTV+"/////////////////////////////");
Log.d("ListAdapter", "priceTV.setText: items.get(2*position) "+priceTV+"/////////////////////////////");
Log.d("ListAdapter", "getView : -----------------------------");
return rowView;
我的主要活动 ListDataActivity
import android.content.Intent;
import android.database.Cursor;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.support.v7.widget.SearchView;
import android.widget.Toast;
import java.util.ArrayList;
public class ListDataActivity extends AppCompatActivity
DatabaseHelper databaseHelper;
ListView listView;
ArrayList<String> listData;
ListAdapter listAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_data);
databaseHelper = new DatabaseHelper(this);
listView = findViewById(R.id.listView);
listData = new ArrayList<String>();
listAdapter = new com.example.barcodescanner.ListAdapter(this,listData);
listView.setAdapter(listAdapter);
popListView();
private void popListView()
Log.d("ListDataActivity","Displaying data in the ListView");
//get data and append to a list
Cursor data = databaseHelper.getData();
listData = new ArrayList<>();
while (data.moveToNext())
//get the data from the columns
//then add it to the ArrayList
listData.add(data.getString(1));
listData.add(data.getString(2));
Log.d("DatabaseHelper", "addData: Adding "+data.getString(1)+"+++++++++++++++++++++++++++++");
Log.d("DatabaseHelper", "addData: Adding "+data.getString(2)+"+++++++++++++++++++++++++++++");
//create the list adapter and set the adapter
//final ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
listView.setAdapter(listAdapter);
//set an OnClickListener to the listView
//we can use Object for data type here
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
String name = adapterView.getItemAtPosition(i).toString();
String price = adapterView.getItemAtPosition(i).toString(); // we can use Object for data type here
Log.d("ListDataActivity", "onItemClick: You Clicked on " + name);
Cursor data = databaseHelper.getItemID(name); //get the id associated with that name
int itemID = -1;
while (data.moveToNext())
itemID = data.getInt(0);
if (itemID > -1)
Log.d("ListDataActivity","onItemClick: the ID is : "+itemID);
Intent editScreenIntent = new Intent(ListDataActivity.this,EditDataActivity.class);
editScreenIntent.putExtra("id",itemID);
editScreenIntent.putExtra("name",name);
editScreenIntent.putExtra("price",price);
startActivity(editScreenIntent);
//finish();
else
toastMessage("No ID associate with this name");
);
@Override
public boolean onCreateOptionsMenu(Menu menu)
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.search_menu,menu);
MenuItem searchItem = menu.findItem(R.id.item_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
@Override
public boolean onQueryTextSubmit(String query)
return false;
@Override
public boolean onQueryTextChange(String newText)
ArrayList<String> userslist = new ArrayList<>();
for(String user : listData)
if(user.toLowerCase().contains(newText.toLowerCase()))
userslist.add(user);
//ArrayAdapter<String> adapter = new ArrayAdapter<>(ListDataActivity.this,
// android.R.layout.simple_list_item_1,userslist);
listView.setAdapter(listAdapter);
return true;
);
return super.onCreateOptionsMenu(menu);
//customized toast message
private void toastMessage(String message)
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
我的自定义列表布局 custom_list
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="horizontal" >
<LinearLayout android:layout_
android:layout_
android:orientation="horizontal">
<TextView
android:id="@+id/nameTV"
android:layout_
android:layout_
android:text="Name"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginLeft="20dp"
android:layout_marginRight="100dp"
android:layout_marginTop="5dp"
android:textColor="#4d4d4d"
/>
<TextView
android:id="@+id/priceTV"
android:layout_
android:layout_
android:text="Price"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginLeft="20dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:textColor="#4d4d4d"
/>
</LinearLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
activity_list_data
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".ListDataActivity">
<ListView
android:id="@+id/listView"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</ListView>
</android.support.constraint.ConstraintLayout>
【问题讨论】:
【参考方案1】:在您的onCreate
方法中,您将一个空的ArrayList
传递给您的适配器。然后调用popListView
,然后将listData
变量重新初始化为新对象(new ArrayList()
)。所以你的适配器永远不会收到任何数据。
在创建适配器之前,将调用 popListView
上移 2 行。
更新
如下创建一个新类:
class DataStructure
private String name;
private String price;
DataStructure(String name, String price)
this.name = name;
this.price = price;
String getName()
return name;
String getPrice()
return price;
然后使用class ListAdapter extends ArrayAdapter<DataStructure>
更改您的适配器类型
将listData
更改为ArrayList<DataStructure>
。
当您从数据库中读取数据时,创建一个新的 DataStructure 实例并将每个实例添加到您的列表中。
【讨论】:
谢谢。它有效,但items.get(2*position)
一直给我这个错误IndexOutOfBoundsException
.... 为什么?不像position
返回items.size
?对吗?
position
是一个在 0 到 items.size()
范围内的 int
。您只能对同一范围内的项目调用get
。例如,如果列表包含 12 项,则您无法访问第 16 项。为什么要乘以 2?
对不起,最大值是items.size()-1
。以上是关于getView() 在我的自定义列表视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的自定义 Nextjs 服务器在我的 Vercel 部署中不起作用?
使用 Xib 创建的自定义视图在 Interface Builder 中不起作用
在 ag-grid 中带有下拉菜单的自定义过滤器在角度 10 中不起作用
Android - 可扩展列表视图 SetIndicatorBounds 在 Kitkat android-4.4 中不起作用