2015-04-16 64 views
1

我試圖創建一個可以綁定到從數據庫對象的列表,有idname性質的通用微調適配器,這樣我就可以1)獲得與所選擇的價值id在微調中;和2)設置基於所述對象id,而不是位置上所選擇的項目,如IDS將不匹配在微調的位置:的Android定製微調適配器綁定

id name 
-- ----- 
1 Alice 
3 Bob 

爲定製適配器以下代碼中發現here是一個好的開始,並是通用的:

import java.util.List; 

import android.content.Context; 
import android.graphics.Color; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

public class SpinAdapter<T> extends ArrayAdapter<T> { 
private Context context; 
private List<T> values; 

public SpinAdapter(Context context, int textViewResourceId, List<T> values) { 
    super(context, textViewResourceId, values); 
    this.context = context; 
    this.values = values; 
} 

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

public T getItem(int position) { 
    return values.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView label = new TextView(context); 
    label.setTextColor(Color.BLACK); 
    label.setText(values.toArray(new Object[values.size()])[position] 
      .toString()); 
    return label; 
} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    TextView label = new TextView(context); 
    label.setTextColor(Color.BLACK); 
    label.setText(values.toArray(new Object[values.size()])[position] 
      .toString()); 

    return label; 
} 
} 

爲了設置所選的值,我需要適配器返回位置給出其ID的對象。我想添加一個方法,如public int getPosition (long id)循環遍歷列表中的所有項目,並返回具有正確標識的項目的索引。

然而,作爲一個初學者,我不太放心使用泛型類型,抽象類和接口。我試圖通過一個抽象類DatabaseItem取代通用<T>如:

public abstract class DatabaseItem { 
    public abstract long getId(); 
    public abstract String getName(); 
} 

,使我的對象類擴展DatabaseItem,但我不認爲這個工程。 任何幫助,將不勝感激。

+0

一個主適配器來控制所有其他。傳奇的目標。我認爲迫使你所有的「適應性」模型「擴展」一類是危險的。您應該考慮將'DatabaseItem'轉換爲'interface'。 –

+0

所有這一切,如果它可以工作。我只希望我知道如何調用我只在接口中定義的方法 - 比如getId() - 在(通用)適配器類中。 – phme

回答

0

繼bigdestroyers'評論,我使用的接口:

public interface DatabaseItem { 
    public abstract long getId(); 
    public abstract String getName(); 
} 

然後添加自定義適配器下面的方法:

public int getPosition(long id){ 
    int position = -1; 
    for(T v : values) { 
     if(((DatabaseItem)v).getId() == id) { 
      position = values.indexOf(v); 
     } 
    } 
    return position; 
} 

不知道這是最好的或更優雅的方式做,但它似乎在伎倆。

+0

而不是'T'類型參數必須是'T extends DatabaseItem'。所以你不需要施加'v',只需調用'getId'。這個目標是爲了避免鑄造 –

+0

好點,謝謝! – phme