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

一个适配器多种数据类型-android

  •  0
  • Richardweber32  · 技术社区  · 7 年前

    不同之处。java文件用于显示同一事物的不同类型,因此从共享父对象继承,例如basicrunner extends runner和lollipoprunner extends runner。

    适配器扩展了BaseAdapter,并重写getItem等的方法,但它们指定了一种返回类型;

    public class RunnersAdapter extends BaseAdapter {
    private static final String TAG = "RunnersAdapter";
    
    //used in switch statement to decide which XML to inflate
    private static final int LayoutTYPE_1 = 1;  
    private static final int LayoutTYPE_2 = 2;
    private static final int LayoutTYPE_3 = 3;
    int layout = 2; //hard coded just for testing
    
    @Override
    public Runner getItem(int position) { //runner is superclass
        return mRunners.get(mKeys[position]);
    }
    

    有没有办法为每种类型的跑步者使用这个RunnerAdapter,或者我最好为每种类型制作一个不同的适配器?

    编辑:

    还有一些代码来说明我的意思:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    if(layout == LayoutTYPE_1){ //LollipopView
    
                Runner runner = getItem(position); //should be a lollipopRunner!!
    
                gridView = inflater.inflate(R.layout.lollipopRunner, null); //use lollipopRunner XML
    }else if(layout == LayoutTYPE_2){
    
                Runner runner = getItem(position);  //should be basicRunner!!
    
                gridView = inflater.inflate(R.layout.basicrunner, null); //use basic runner XML
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sumit Jha    7 年前

    BaseAdapter有几个方法可以重写,以便根据位置返回不同类型的视图。

            @Override
            public int getItemViewType(int position) {
                if (...) return 1;
                else if (...) return 2;
                else if (...) return 3;
                else return 4;
            }
    
            @Override
            public int getViewTypeCount() {
                return 4; //total number of different type of views 
            }
    
    
            @Override
            public View getView(int position, View view, ViewGroup viewGroup) {
    
    
                switch (getItemViewType(position)) {
                    case 0:
                        if (view == null) {
                            view = mActivity.getLayoutInflater().inflate(R.layout.message_item_1, viewGroup, false);
                        }
                        break;
                    case 1:
                        if (view == null) {
                            view = mActivity.getLayoutInflater().inflate(R.layout.message_item_1_media, viewGroup, false);
                        }
                        break;
                    case 2:
                        if (view == null) {
                            view = mActivity.getLayoutInflater().inflate(R.layout.message_item_2, viewGroup, false);
                        }
                        break;
                    case 3:
                        if (view == null) {
                            view = mActivity.getLayoutInflater().inflate(R.layout.message_item_2_media, viewGroup, false);
                        }
                        break;
                }
        }
    

    编辑:

    将数据馈送到适配器时,可以将其作为 List of Object

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    if(layout == LayoutTYPE_1){ //LollipopView
    
                // getItem(postion) will give you Object - downcast it as per the position.
    
                Runner runner = (LollipopRunner)(getItem(position)); //downcast to lollipopRunner
    
                gridView = inflater.inflate(R.layout.lollipopRunner, null); //use lollipopRunner XML
    }else if(layout == LayoutTYPE_2){
    
                Runner runner = (BasicRunner)(getItem(position));  //downcasted to basic runner
    
            gridView = inflater.inflate(R.layout.basicrunner, null); //use basic runner XML
    
        2
  •  0
  •   Klevin Delimeta    7 年前