2017-09-13 61 views
0

我是C#的初學者,我有一個xamarin.android項目,我想查看我的表的數據網格視圖。無法在gridview(C#)中查看sqlite表格數據,System.Collections.Generic.List

使用此代碼爲我的活動:

public class MenuFoodActivity : Activity 
{ 
    string dpPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "HotelDb.db3"); 

    GridView gv; 
    ArrayAdapter adapter; 
    JavaList<String> tvShows = new JavaList<string>(); 


    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.MenuFood); 
     gv = FindViewById<GridView>(Resource.Id.gridViewMenu); 
     adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, tvShows);    
     Retrieve(); 

    } 
    private void Retrieve() 
    { 
     var db = new SQLiteConnection(dpPath); 
     var data = db.Table<FoodTable>(); 
     var data1 = (from values in data 
        select new FoodTable 
        { 
         Shenase = values.Shenase, 
         Types = values.Types, 
         Names = values.Names, 
         Costs = values.Costs 

        }).ToList<FoodTable>(); 

     tvShows.Add(data1); 
     if (tvShows.Size() > 0) 
     { 
      gv.Adapter = adapter; 
     } 
     else 
     { 

      Toast.MakeText(this, "not found.", ToastLength.Short).Show(); 
     } 
    } 
} 

而這一次是axml文件

<GridView 
    android:minWidth="25px" 
    android:minHeight="25px" 
    android:layout_width="wrap_content" 
    android:layout_height="200dip" 
    android:id="@+id/gridViewMenu" 
    android:background="#aaa" 
    android:layout_marginTop="10dip" /> 

的問題是,當我調試項目現場「DATA1」有數據和if語句的結果是對的,但行

gv.Adapter = adapter; 

不起作用,所以我收到這行代替獲取我的數據。

​​
+0

爲什麼使用JavaList ?將它列入列表 tvShows = new List ();從使用System.Collections.Generic; – Merian

+0

我得到這個錯誤:**無法從'System.Collections.Generic.List 轉換爲'System.Collections.Generic.IEnumerable **,在這一行:'tvShows.Add(data1) ;'@美利安 – tbp

回答

0

System.Collections.Generic.List[MainAppHotelXamarin.FoodTable]

您定義的tvShows類型爲JavaList<string>,所以當你使用tvShows.Add(data1)法,data1類型應該是string型。但是你的data1的類型是List<FoodTable>,它們是不兼容的。

修改代碼:如果你要顯示的數據

tvShows.AddRange(data1); 

//Change the type form string to FoodTable 
List<FoodTable> tvShows = new List<FoodTable>(); 

當您添加您的List數據1至List tvShows,你可以使用List.AddRange方法,使用這樣的您的FoodTableGridView中,您可以爲您的班級實施custom adapter,這裏是example

編輯:

HereListView適配器爲例,它與GridView適配器類似,您可以使用它來實現你的功能。

編輯2:

您可以創建一個自定義佈局項目,以顯示你想顯示的任何視圖類型。

例如,創建一個佈局以顯示四位TextView

item.axml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="40dp" 
    android:orientation="horizontal" 
    android:padding="8dp" 
    > 

<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/Shenase" 
    android:layout_weight="1"/> 
<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/Types" 
    android:layout_weight="1" /> 
<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/Names" 
    android:layout_weight="1" /> 
<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/Costs" 
    android:layout_weight="1" /> 

</LinearLayout> 

創建GridViewAdapter

public class GridViewAdapter : BaseAdapter<FoodTable> 
{ 
    private MainActivity mContext; 
    private List<FoodTable> tvShows; 

    public GridViewAdapter(MainActivity context, List<FoodTable> tvShows) 
    { 
     this.mContext = context; 
     this.tvShows = tvShows; 
    } 

    public override FoodTable this[int position] 
    { 
     get { return tvShows[position]; } 
    } 

    public override int Count => tvShows.Count; 

    public override long GetItemId(int position) 
    { 
     return position; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     FoodTable item = tvShows[position]; 

     View view = convertView; // re-use an existing view, if one is available 
     if (view == null) 
      view = mContext.LayoutInflater.Inflate(Resource.Layout.item, null); 

     view.FindViewById<TextView>(Resource.Id.Shenase).Text = item.Types; 
     view.FindViewById<TextView>(Resource.Id.Types).Text = item.Types; 
     view.FindViewById<TextView>(Resource.Id.Names).Text = item.Names; 
     view.FindViewById<TextView>(Resource.Id.Costs).Text = item.Costs; 

     return view; 
    } 
} 

使用它在你的代碼:

adapter = new GridViewAdapter(this, tvShows);// not use ArrayAdapter 

類似this的效果。

+0

非常感謝。我編輯了這些行:'List tvShows = new List ();','tvShows.AddRange(data1);'和'if(tvShows.Count> 0)'。現在沒有任何錯誤,但我不能使用** create_a_grid_view **項目,因爲它用於在gridview中查看圖像,而我的是'string'。你會給我任何關於這個問題的鏈接或想法嗎? @York Shen - MSFT – tbp

+0

@tbp,你解決了你的問題嗎? –

+0

Shen -MSFT感謝您的解決方案。 **第二編輯**非常適合我。 – tbp