Reputation: 1786
I'm trying to make a dynamic list view of books based on a search query by title, author, or ISBN.
I can display one item, but for whatever reason, I can't see any other items that match the search query.
Main method
// Set up search array
int i = 0;
String searchEntries[] = InventoryAdapter.getTitleAndAuthorByISBN(isbn);
searchArray.add(new InventoryItem(searchQuery, searchEntries));
// add data in custom adapter
adapter = new CustomAdapter(this, R.layout.list, searchArray);
ListView dataList = (ListView) findViewById(R.id.list);
dataList.setAdapter(adapter);
CustomAdapter
public class CustomAdapter extends ArrayAdapter<InventoryItem> {
Context context;
int layoutResourceId;
LinearLayout linearMain;
ArrayList<InventoryItem> data = new ArrayList<InventoryItem>();
public CustomAdapter(Context context, int layoutResourceId,
ArrayList<InventoryItem> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
linearMain = (LinearLayout) row.findViewById(R.id.lineraMain);
InventoryItem myItem = data.get(position);
for (int j = 0; j < myItem.getDetails().length; j++) {
TextView label = new TextView(context);
label.setText(myItem.details[j]);
linearMain.addView(label);
}
}
return row;
}
}
InventoryItem
public class InventoryItem {
public String query;
public String details[];
public InventoryItem(String query, String[] details) {
super();
this.query = query;
this.details = details;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public String[] getDetails() {
return details;
}
public void setDetails(String[] details) {
this.details = details;
}
}
list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lineraMain"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp" >
</LinearLayout>
Main method xml
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="95"
android:orientation="vertical">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:overScrollMode="always"
android:isScrollContainer="true"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:scrollbarStyle="outsideInset"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ListView>
</LinearLayout>
</ScrollView>
</LinearLayout>
Any ideas what I'm doing wrong?
Upvotes: 1
Views: 3737
Reputation: 133560
You have a ListView
inside a ScrollView
. Bad Design not recommended.
http://developer.android.com/reference/android/widget/ScrollView.html
Quoting docs
You should never use a ScrollView with a ListView, because ListView takes care of its own vertical scrolling. Most importantly, doing this defeats all of the important optimizations in ListView for dealing with large lists, since it effectively forces the ListView to display its entire list of items to fill up the infinite container supplied by ScrollView.
Also change getView
to
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
linearMain = (LinearLayout) row.findViewById(R.id.lineraMain);
}
InventoryItem myItem = data.get(position);
TextView label = new TextView(context);
label.setText(myItem.details[positon]);
linearMain.addView(label);
return row;
}
Edit:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lineraMain"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Then in getView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if ( convertView== null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate(layoutResourceId, parent, false);
holder = ViewHolder();
holder.tv = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
InventoryItem myItem = data.get(position);
holder.tv.setText(myItem.details[positon]);
return convertView;
}
static class ViewHolder
{
TextView tv;
}
Upvotes: 1