0

我有一个列表 Activity 4,我扩展了 BaseAdapter,getview 看起来像这样......

public View getView(int position, View convertView, ViewGroup parent) {
            View row=null;
            for(int i=0;i<10;)
            {   
            row = convertView;
            if(row==null)
            {
                LayoutInflater inflater = mContext.getLayoutInflater();
                row = inflater.inflate(R.layout.parsed,null);
            }
            TextView id = (TextView)row.findViewById(R.id.id);
            id.setText(idvector.elementAt(position));
            TextView photo = (TextView)row.findViewById(R.id.photo);
            photo.setText(photovector.elementAt(position));
            TextView subcategory = (TextView)row.findViewById(R.id.subcategory);
            subcategory.setText(subcategoryvector.elementAt(position));
            TextView name = (TextView)row.findViewById(R.id.name);
            name.setText(namevector.elementAt(position));
            }
            return(row);
        }

    }

现在我的问题是列表没有给出向量的所有值,也没有滚动..如何让我的列表可滚动???

4

4 回答 4

1

getView方法旨在膨胀、填充和返回单个列表行。

您需要做的就是:

public View getView(int position, View convertView, ViewGroup parent) {
    // Inflate the individual row from the 'parsed' layout
    View row = mInflater.inflate(R.layout.parsed);

    // Set the properties on the inflated row
    TextView id = (TextView) row.findViewById(R.id.id);
    id.setText(idvector.elementAt(position));
    TextView photo = (TextView) row.findViewById(R.id.photo);
    photo.setText(photovector.elementAt(position));
    TextView subcategory = (TextView) row.findViewById(R.id.subcategory);
    subcategory.setText(subcategoryvector.elementAt(position));
    TextView name = (TextView) row.findViewById(R.id.name);
    name.setText(namevector.elementAt(position));

    return row;
}

Ramps 的意思是,与其创建并传入四个单独的向量,不如创建一个对象(或您所代表的任何对象BaseAdapter)的单个向量(或列表),每个对象都带有 、 和成员变量。即使事情更加面向对象!:)Photoidphotosubcategoryname

至于列表不滚动;只有当列表中的项目数超过可用的屏幕空间时,它才会滚动。如果您的列表中仅显示四个项目,则不会滚动任何内容。

您还应该检查您如何调用BaseAdaptersuper 方法(大概您正在扩展ArrayAdapter):您是传入数据向量之一,还是其他一些数据结构?如果基础适配器没有您想要渲染的正确信息,它就不会渲染它!:)

于 2009-12-29T13:24:37.257 回答
0

我不确定,但似乎您没有将物品放入适配器。在您的代码片段中,您正在从不同的向量(idvector、subcategoryvector 等)中检索元素。可能你应该创建一个代表项目类型的类,在那里保存你需要的所有东西 - id,子类别,照片)并将该项目添加到你的适配器。
请检查适配器的尺寸。

还有一件事。似乎不需要代码中的“for”循环。

问候!

好的,这里有一些例子。RowData 是我的项目的一个类。如您所见,我的自定义适配器扩展了 ArrayAdapter < RowData > 我可以通过调用 adapter.add(rowInstance) 将新项目放在那里。


public class CustomList extends ListActivity {
private LayoutInflater mInflater;
private Vector data;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        
    mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    data = new Vector();
    RowData rd = new RowData("item1", "description1");
    data.add(rd);
    rd = new RowData("item2", "description2");
    data.add(rd);
    rd = new RowData("item2", "description3");
    data.add(rd);

    CustomAdapter adapter = new CustomAdapter(this, R.layout.custom_row,R.id.item, data);
    setListAdapter(adapter);        
    getListView().setTextFilterEnabled(true);
}


public void onListItemClick(ListView parent, View v, int position, long id) {
    CustomAdapter adapter = (CustomAdapter) parent.getAdapter();
        RowData row = adapter.getItem(position);                
    Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(row.mItem); 
    builder.setMessage(row.mDescription + " -> " + position );
    builder.setPositiveButton("ok", null);
    builder.show();
}

/**
 * Data type used for custom adapter. Single item of the adapter.      
 */
private class RowData {
    protected String mItem;
        protected String mDescription;

        RowData(String item, String description){
        mItem = item;
        mDescription = description;             
    }

        @Override
        public String toString() {
                return mItem + " " +  mDescription;
        }
}

private class CustomAdapter extends ArrayAdapter < RowData > {

        public CustomAdapter(Context context, int resource,
                        int textViewResourceId, List objects) {
                super(context, resource, textViewResourceId, objects);

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder = null;

                //widgets displayed by each item in your list
                TextView item = null;
                TextView description = null;

                //data from your adapter
                RowData rowData= getItem(position);


                //we want to reuse already constructed row views...
                if(null == convertView){
                        convertView = mInflater.inflate(R.layout.custom_row, null);
                        holder = new ViewHolder(convertView);
                        convertView.setTag(holder);
                }
                // 
                holder = (ViewHolder) convertView.getTag();
                item = holder.getItem();
                item.setText(rowData.mItem);

                description = holder.getDescription();          
                description.setText(rowData.mDescription);

                return convertView;
        }
}

/**
 * Wrapper for row data.
 *
 */
private class ViewHolder {      
    private View mRow;
    private TextView description = null;
    private TextView item = null;

        public ViewHolder(View row) {
        mRow = row;
        }

        public TextView getDescription() {
                if(null == description){
                        description = (TextView) mRow.findViewById(R.id.description);
                }
                return description;
        }

        public TextView getItem() {
                if(null == item){
                        item = (TextView) mRow.findViewById(R.id.item);
                }
                return item;
        }       
}
于 2009-12-29T12:38:56.807 回答
0

对不起,伙计们……非常非常抱歉……我太愚蠢了……我没有更改以下代码……对不起,伙计们 4 浪费了很多宝贵的时间……

  public int getCount() 
{
                return idvector.size();
            }

非常感谢斜坡...我将执行您显示的程序...

于 2009-12-29T13:34:49.573 回答
-2

您的意思是,如果您的 ListView 内容大于您显示它的区域,您希望它滚动吗?如果是这样,请在要滚动的内容周围添加一个 ScrollView。

// inside of the parent layout(most likely a Linear Layout)
<ScrollView android:layout_height="wrap_content" 
            android:id="@+id/ScrollView01" 
            android:layout_width="wrap_content" 
            android:scrollbarAlwaysDrawHorizontalTrack="false" 
            android:scrollbars="vertical">

      <RelativeLayout android:id="@+id/RelativeLayout01" 
                      android:layout_width="wrap_content" 
                      android:layout_height="wrap_content">

             <ListView android:id="@id/android:list" 
                       android:layout_width="wrap_content" 
                       android:layout_height="380dip"
                       android:layout_marginLeft="20dip" 
                       android:layout_marginRight="20dip"
                       android:layout_marginTop="130dip" />     
      </RelativeLayout>
</ScrollView>
于 2009-12-29T13:12:12.387 回答