2013-12-18 71 views
3

我試圖複製此Google Now卡界面。我並不擔心卡片的感覺,但我更關心視圖是如何構建的。使用不同類型的適配器根據行創建視圖

Google Now Cards

我想用它返回對應於該行的不同佈局的適配器。但正如你所看到的,這兩個視圖都包含了彼此不相關的信息。

是否有可能有一個ListView與不同的行適配器?

或者我如何使用自定義視圖來實現這一點?

+0

一個列表視圖和一個自定義適配器,根據情況膨脹不同的視圖(xml)是最好的方式。 –

+0

yupp你必須這樣做,像這種方式只膨脹不同的xmls – Shubham

+0

自定義視圖可以解決它,沒有你不能有一個視圖的多個適配器。它將取代其他適配器的情況下。 – KaHeL

回答

0

首先,你需要創建一個CustomAdapter此:

public class CustomAdapter extends BaseAdapter { 
    ArrayList<View> views; 
    Context context; 

    public CustomAdapter(Context context, ArrayList<View> views){ 
     this.views = views; 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     return views.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return i; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     View rowView = views.get(i); 
     /*set the views of the rowView here but take note use try catch since you can't be sure if the view will be present or not this is the part where I do not advice it to have different custom views per row but it's all yours to do your tricks*/ 

     return rowView; 
    } 
} 

,並使用它,這裏是我的樣品方法上創建:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 

     ArrayList<View> views = new ArrayList<View>(); 

     CustomAdapter adapter = new CustomAdapter(MainActivity.this,views); 
     ListView custom_list = (ListView)findViewById(R.id.list_custom); 
     custom_list.setAdapter(adapter); 

     LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view1 = inflater.inflate(R.layout.view1, null); 
     View view2 = inflater.inflate(R.layout.view2, null); 

     views.add(view1); 
     views.add(view2); 
     adapter.notifyDataSetChanged(); 
} 

如果有需要,請做好您的解決方法,但基本上就是這樣。膨脹視圖,將它傳遞給你的arrayList,然後將其設置在你的listView上。

3

您將需要使用單個適配器並根據列表中的位置膨脹不同視圖。一個很好的回答這個問題是在這裏:

Android ListView with different layouts for each row

+0

如何爲不同類型的信息使用單個適配器?比方說,我正在使用「運動」對象來充氣頂牌和「天氣」物體來充氣底牌,這對於適配器來說會如何工作?這是我的主要問題 – AndroidEnthusiast

+0

我從來沒有這樣做過。但是猜測你可能想要使用它的構造函數將2個數據源傳遞到你的自定義適配器中,然後你可以根據你膨脹的佈局從你需要的任何數據源獲取數據。您可能需要在getView方法中操作位置變量,以便從每個數據源中獲取正確的項目,但我認爲這應該不是什麼大問題 – Dreagen

相關問題