erad
erad

Reputation: 1786

Dynamic List View Android

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

Answers (1)

Raghunandan
Raghunandan

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 getViewto

 @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

Related Questions