【问题标题】:Dynamic List View Android动态列表视图 Android
【发布时间】:2014-01-10 17:17:57
【问题描述】:

我正在尝试根据书名、作者或 ISBN 的搜索查询创建图书的动态列表视图。

我可以显示一项,但由于某种原因,我看不到与搜索查询匹配的任何其他项。

主要方法

    // 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);

自定义适配器

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>

主方法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>

任何想法我做错了什么?

【问题讨论】:

    标签: android android-listview android-sqlite


    【解决方案1】:

    ScrollView 中有一个 ListView。不推荐糟糕的设计。

    http://developer.android.com/reference/android/widget/ScrollView.html

    引用文档

    你不应该将 ScrollView 与 ListView 一起使用,因为 ListView 负责自己的垂直滚动。最重要的是,这样做 击败了 ListView 中所有重要的交易优化 使用大列表,因为它有效地强制 ListView 显示 它的整个项目列表来填充由提供的无限容器 滚动视图。

    也将getView改为

     @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;
    
       }
    

    编辑:

    <?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>
    

    然后在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;
       } 
    

    【讨论】:

    • 你的getView编辑的主要区别是你取出了for循环,但是如果我取出for循环,我在label.setText(myItem.details[j]); - 没有那个for循环就没有“j”?
    • @user3152800 是的,没有必要。因此。你可以使用position
    • @user3152800 和一个很大的不要在滚动视图中列出视图。删除滚动视图
    • 原始编辑对我有用。谢谢。新的编辑建议对我来说似乎有问题。静态类'ViewHolder { TextView tv; ' 没有构造函数,所以我收到错误,因为没有 ViewHolder 类型。
    • @user3152800 你需要首先在布局中有一个文本视图。这只是一个用于平滑滚动和性能的视图持有者类。没有错。developer.android.com/training/improving-layouts/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2018-07-08
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多