代码之家  ›  专栏  ›  技术社区  ›  uzay95

通用ListAdapter是如何工作的?

  •  0
  • uzay95  · 技术社区  · 16 年前

    我是新手。如果我问了一个荒谬的问题,我很抱歉。

    我想要通用适配器类实现 ListAdapter .我必须覆盖它的一些功能,比如 getView .

    getView函数是我认为最重要的部分,它在渲染时调用(比如asp.net(我认为))。

    我已经在下面最简单的级别编写了一些代码:

    package com.yeni.listAdapter;
    
    import android.app.ListActivity;
    import android.os.Bundle;
    
    public class baslangicAktivitesi extends ListActivity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.main);
            setListAdapter(new NewAdapter(this));
        }
    }
    

    这是我的通用ListAdapter类:

    package com.yeni.listAdapter;
    
    import android.content.Context;
    import android.database.DataSetObserver;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.LinearLayout;
    import android.widget.ListAdapter;
    import android.widget.TextView;
    
    public class NewAdapter implements ListAdapter {
        private Context ctx;
    
        public NewAdapter(Context _ctx) {
            super();
            ctx = _ctx;
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public int getItemViewType(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView tv = new TextView(ctx);
            tv.setText("This text will be shown");
    
            LinearLayout lila = new LinearLayout(ctx);
            lila.addView(tv,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
    
            return lila;
        }
    
        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public boolean hasStableIds() {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public void registerDataSetObserver(DataSetObserver observer) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void unregisterDataSetObserver(DataSetObserver observer) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public boolean areAllItemsEnabled() {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public boolean isEnabled(int position) {
            // TODO Auto-generated method stub
            return false;
        }
    }
    

    我想知道的是ListAdapter的机制是怎样的,如果我想用xml编写模板(我想会的) res->layout 它应该是怎样的(复合视图),我想写一些东西ImageView和TextView?

    非常感谢你。。。

    1 回复  |  直到 16 年前
        1
  •  0
  •   st0le    16 年前

    很难理解你的意思。。。但我的最佳选择是,你想知道如何使用自己的习惯 xml 作为ListActivity中的ListItem。。。。

    正如您所猜测的,为Listitem创建一个xml模板,并将其存储在布局中。。。

    你需要一个 LayoutInflater ...

    LayoutInflater mInflater = LayoutInflater.from(context);
    

    这是我找到的示例代码的黑客版本 here

     public View getView(int position, View convertView, ViewGroup parent) {
                ....;
    
                // When convertView is not null, we can reuse it directly, there is no need
                // to reinflate it. We only inflate a new View when the convertView supplied
                // by ListView is null.
                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
    
                    TextView tvFoo = (TextView) convertView.findViewById(R.id.text);
                    ImageView ivBar = (ImageView) convertView.findViewById(R.id.icon);
                }
                // Bind the data efficiently with the holder.
                tvFoo.setText(/* data at position */);
                ivBar.setImageBitmap(/* image at position*/);
    
                return convertView;
            }
    

    注: R.layout.list_item_icon_text 是自定义布局的id。:)