我正在尝试使用CursorLoader在设备上构建本地文件的音乐浏览器/播放器。我正在使用Xamarin android,c#。我使用的是片段内的ViewPager(不是FragmentActivity,因为片段是导航抽屉的一部分)。
我无法使用用于显示歌曲的listView.Adapter,因为我无法获取Activity。当直接在活动中使用此listview适配器时,它工作正常(我可以看到歌曲列表),但是当尝试在使用PagerAdapter的ViewPager中使用它时(在Fragment中全部使用)。我无法在listView.Adapter = new SongsAdapter(此,cursor,songsList)中获得Activity 。您能否指导我,以便能够将活动传递给适配器,或者让我知道我是否做错了一般情况(这使得不可能)?
谢谢你。感谢您的帮助:)
朱利安
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.Support.V4.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Support.V4.View;
using Android.Provider;
using Android.Database;
using Android.Net;
namespace project
{
public class MyDeviceFragment : Fragment
{
private SlidingTabScrollView mSlidingTabScrollView;
private ViewPager mViewPager;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.Inflate(Resource.Layout.slidingtabfragment, container, false);
}
public override void OnViewCreated(View view, Bundle savedInstanceState)
{
var activity = Activity;
mSlidingTabScrollView = view.FindViewById<SlidingTabScrollView>(Resource.Id.sliding_tabs);
mViewPager = view.FindViewById<ViewPager>(Resource.Id.viewpager);
mViewPager.Adapter = new SamplePagerAdapter();
mSlidingTabScrollView.ViewPager = mViewPager;
}
public class SamplePagerAdapter : PagerAdapter
{
List<string> items = new List<string>();
public SamplePagerAdapter() : base()
{
items.Add("PLaylists");
items.Add("Songs");
items.Add("Albums");
items.Add("Artists");
items.Add("Genres");
}
public override int Count
{
get { return items.Count; }
}
public override bool IsViewFromObject(View view, Java.Lang.Object obj)
{
return view == obj;
}
public override Java.Lang.Object InstantiateItem(ViewGroup container, int position)
{
View view = null;
switch (position) {
case 1:
ListView listView;
view = LayoutInflater.From (container.Context).Inflate (Resource.Layout.testinglistactivity, container, false);
listView = view.FindViewById<ListView> (Resource.Id.List);
List<Song> songsList;
var uri = MediaStore.Audio.Media.ExternalContentUri;
string[] projection = {
MediaStore.Audio.Media.InterfaceConsts.Id,
MediaStore.Audio.Media.InterfaceConsts.AlbumId,
MediaStore.Audio.Media.InterfaceConsts.Title,
MediaStore.Audio.Media.InterfaceConsts.Artist,
};
var loader = new CursorLoader (container.Context, uri, projection, null, null, null);
var cursor = (ICursor)loader.LoadInBackground ();
songsList = new List<Song> ();
if (cursor.MoveToFirst ()) {
do {
songsList.Add (new Song {
Id = cursor.GetLong (cursor.GetColumnIndex (projection [0])),
AlbumId = cursor.GetString (cursor.GetColumnIndex (projection [1])),
Title = cursor.GetString (cursor.GetColumnIndex (projection [2])),
Artist = cursor.GetString (cursor.GetColumnIndex (projection [3]))
});
} while (cursor.MoveToNext ());
}
listView.Adapter = new SongsAdapter (this,cursor,songsList);//***********HERE is the issue*********************
break;
default:
view = LayoutInflater.From (container.Context).Inflate (Resource.Layout.pager_item, container, false);
int pos = position + 1;
TextView txtTitle = view.FindViewById<TextView> (Resource.Id.item_title);
txtTitle.Text = pos.ToString ();
break;
}
container.AddView (view);
return view;
}
public string GetHeaderTitle (int position)
{
return items[position];
}
public override void DestroyItem(ViewGroup container, int position, Java.Lang.Object obj)
{
container.RemoveView((View)obj);
}
}
}
}
通过执行以下操作,我能够解决此问题:
将this.context = context添加到SamplePager适配器的构造函数中
公共类SamplePagerAdapter:PagerAdapter {活动上下文;列表项= new List();
public SamplePagerAdapter(Activity context) : base()
{
this.context = context;
items.Add("PLaylists");
items.Add("Songs");
items.Add("Albums");
items.Add("Artists");
items.Add("Genres");
}
...
可选的(不是必需的):我确实将SamplePagerAdapter分隔在另一个文件中,在该文件中我可以使用Android.App而不是Android.Support.V4.App;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句