ListView 项目作为进度条
ListView item as a progress bar
我想知道是否有人可以帮助我实现以下目的:
我创建了一个只显示 table 的应用程序。它显示了一个 table 头部和一个包含多个项目的列表视图。
是否有可能,如果点击这些项目之一,会显示一个进度条,该进度条会在特定时间间隔(比如 30 秒)内从左到右平稳加载?
请看下面我的截图,也许更容易理解我想做什么:
最后,不知道有没有帮助,还是附上一些代码吧。我把它缩短了一点,如果缺少理解的东西(比如列表class)或者如果我删除了很多,请告诉我:
public class TableActivity : Activity
{
ListView lv;
ListAdapter adapter = null;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
//...
lv = FindViewById<ListView>(Resource.Id.geraeteListView);
adapter = new ListAdapter(this, Resource.Layout.List, geraeteliste.CurrentGeraeteliste, Intent.GetStringExtra("ServerIP"))
{
parentActivity = this
};
lv.Adapter = adapter;
}
private async void OnItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
if (geraeteliste.CurrentGeraeteliste[e.Position].bespielt == "J") return;
//…
await Task.Delay(0);
}
}
public class ListAdapter : ArrayAdapter
{
//...
public override View GetView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if (v == null)
{
LayoutInflater inflater = (LayoutInflater)Context.GetSystemService(Context.LayoutInflaterService);
v = inflater.Inflate(Resource.Layout.List, parent, false);
}
//...
v.FindViewById<ImageView>(Resource.Id.typeImageView).SetImageResource(Resource.Drawable.Icon);
v.FindViewById<TextView>(Resource.Id.numberTextView).Text = Geraetelist[position].geraeteplatz;
v.FindViewById<TextView>(Resource.Id.descriptionTextView).Text = Geraetelist[position].geraeteinformation;
ImageView iv = v.FindViewById<ImageView>(Resource.Id.bspImageView);
iv.SetImageResource(Geraetelist[position].bespielt == "N" ? Resource.Drawable.greenPoint : Resource.Drawable.redPoint);
//…
return v;
}
}
谁能给我一个简短的提示之类的?我怎样才能为点击的每个项目实现这样的进度条?^^ 如果有任何帮助,我将非常高兴。
预先感谢您的每一个回答,
此致
很明显,您缺少一些有关 ListView 的知识。这个 Xamarin university course 有一些示例和一个解释不同组件的视频。
但基本上,您可以将 background progress bar
作为 View
放在 row
AXML 布局文件中,并根据 Progress
属性,那个视图可以改变宽度。
如果您有任何问题,请告诉我
Is it possible, that if one clicks on one of these items, a progress bar is shown which loads smoothly in a certain time interval (lets say 30 seconds) from left to right?
如果你想在点击Listview项时显示进度条,我给你做了一个例子,你可以看看:
1.Declare ListView 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">
<ListView
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ListView" />
</LinearLayout>
2.Declare 列表行布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar android:id="@+id/progressBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:visibility="invisible"
style="@android:style/Widget.ProgressBar.Horizontal" />
</LinearLayout>
3.Define 列表视图适配器
public class Post
{
public string title { get; set; }
public bool isselect { get; set; }
}
public class CusotmListAdapter : BaseAdapter<Post>
{
Activity context;
List<Post> list;
public CusotmListAdapter(Activity _context, List<Post> _list)
: base()
{
this.context = _context;
this.list = _list;
}
public override Post this[int position]
{
get { return list[position]; }
}
public override int Count
{
get { return list.Count; }
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
// re-use an existing view, if one is available
// otherwise create a new one
if (view == null)
view = context.LayoutInflater.Inflate(Resource.Layout.ListItemRow, parent, false);
Post item = this[position];
view.FindViewById<TextView>(Resource.Id.textView1).Text = item.title;
if(item.isselect==true)
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Visible;
}
else
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Invisible;
}
return view;
}
}
4.Setting 列表视图适配器
public class MainActivity : AppCompatActivity
{
private ListView listview;
List<Post> posts = new List<Post>();
private CusotmListAdapter adapter;
private int oldposition = -1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
posts.Add(new Post() { title = "title 1", isselect = false });
posts.Add(new Post() { title = "title 2", isselect = false });
posts.Add(new Post() { title = "title 3", isselect = false });
posts.Add(new Post() { title = "title 4", isselect = false });
posts.Add(new Post() { title = "title 5", isselect = false });
posts.Add(new Post() { title = "title 6", isselect = false });
posts.Add(new Post() { title = "title 7", isselect = false });
posts.Add(new Post() { title = "title 8", isselect = false });
SetContentView(Resource.Layout.activity_main);
listview = FindViewById<ListView>(Resource.Id.ListView);
listview.ItemClick+= OnListItemClick;
adapter= new CusotmListAdapter(this, posts);
listview.Adapter = adapter;
}
private void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
if(oldposition!=-1)
{
Post p1 = adapter[oldposition];
p1.isselect = false;
}
oldposition = e.Position;
Post p = adapter[e.Position];
p.isselect = true;
adapter.NotifyDataSetChanged();
}
}
更新
您可以更改 CusotmListAdapter GetView 事件中的一些代码:
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
// re-use an existing view, if one is available
// otherwise create a new one
if (view == null)
view = context.LayoutInflater.Inflate(Resource.Layout.ListItemRow, parent, false);
Post item = this[position];
view.FindViewById<TextView>(Resource.Id.textView1).Text = item.title;
ProgressBar p = view.FindViewById<ProgressBar>(Resource.Id.progressBar1);
p.Max = 100;
p.Progress = 100;
//p.IncrementProgressBy(-10);
if(item.isselect==true)
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Visible;
new Thread(new ThreadStart(delegate
{
while (p.Progress > 0)
{
p.Progress -= 20;
Thread.Sleep(1000);
}
})).Start();
}
else
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Invisible;
}
return view;
}
那请看截图:
我想知道是否有人可以帮助我实现以下目的:
我创建了一个只显示 table 的应用程序。它显示了一个 table 头部和一个包含多个项目的列表视图。
是否有可能,如果点击这些项目之一,会显示一个进度条,该进度条会在特定时间间隔(比如 30 秒)内从左到右平稳加载?
请看下面我的截图,也许更容易理解我想做什么:
最后,不知道有没有帮助,还是附上一些代码吧。我把它缩短了一点,如果缺少理解的东西(比如列表class)或者如果我删除了很多,请告诉我:
public class TableActivity : Activity
{
ListView lv;
ListAdapter adapter = null;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
//...
lv = FindViewById<ListView>(Resource.Id.geraeteListView);
adapter = new ListAdapter(this, Resource.Layout.List, geraeteliste.CurrentGeraeteliste, Intent.GetStringExtra("ServerIP"))
{
parentActivity = this
};
lv.Adapter = adapter;
}
private async void OnItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
if (geraeteliste.CurrentGeraeteliste[e.Position].bespielt == "J") return;
//…
await Task.Delay(0);
}
}
public class ListAdapter : ArrayAdapter
{
//...
public override View GetView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if (v == null)
{
LayoutInflater inflater = (LayoutInflater)Context.GetSystemService(Context.LayoutInflaterService);
v = inflater.Inflate(Resource.Layout.List, parent, false);
}
//...
v.FindViewById<ImageView>(Resource.Id.typeImageView).SetImageResource(Resource.Drawable.Icon);
v.FindViewById<TextView>(Resource.Id.numberTextView).Text = Geraetelist[position].geraeteplatz;
v.FindViewById<TextView>(Resource.Id.descriptionTextView).Text = Geraetelist[position].geraeteinformation;
ImageView iv = v.FindViewById<ImageView>(Resource.Id.bspImageView);
iv.SetImageResource(Geraetelist[position].bespielt == "N" ? Resource.Drawable.greenPoint : Resource.Drawable.redPoint);
//…
return v;
}
}
谁能给我一个简短的提示之类的?我怎样才能为点击的每个项目实现这样的进度条?^^ 如果有任何帮助,我将非常高兴。
预先感谢您的每一个回答,
此致
很明显,您缺少一些有关 ListView 的知识。这个 Xamarin university course 有一些示例和一个解释不同组件的视频。
但基本上,您可以将 background progress bar
作为 View
放在 row
AXML 布局文件中,并根据 Progress
属性,那个视图可以改变宽度。
如果您有任何问题,请告诉我
Is it possible, that if one clicks on one of these items, a progress bar is shown which loads smoothly in a certain time interval (lets say 30 seconds) from left to right?
如果你想在点击Listview项时显示进度条,我给你做了一个例子,你可以看看:
1.Declare ListView 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">
<ListView
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ListView" />
</LinearLayout>
2.Declare 列表行布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ProgressBar android:id="@+id/progressBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:visibility="invisible"
style="@android:style/Widget.ProgressBar.Horizontal" />
</LinearLayout>
3.Define 列表视图适配器
public class Post
{
public string title { get; set; }
public bool isselect { get; set; }
}
public class CusotmListAdapter : BaseAdapter<Post>
{
Activity context;
List<Post> list;
public CusotmListAdapter(Activity _context, List<Post> _list)
: base()
{
this.context = _context;
this.list = _list;
}
public override Post this[int position]
{
get { return list[position]; }
}
public override int Count
{
get { return list.Count; }
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
// re-use an existing view, if one is available
// otherwise create a new one
if (view == null)
view = context.LayoutInflater.Inflate(Resource.Layout.ListItemRow, parent, false);
Post item = this[position];
view.FindViewById<TextView>(Resource.Id.textView1).Text = item.title;
if(item.isselect==true)
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Visible;
}
else
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Invisible;
}
return view;
}
}
4.Setting 列表视图适配器
public class MainActivity : AppCompatActivity
{
private ListView listview;
List<Post> posts = new List<Post>();
private CusotmListAdapter adapter;
private int oldposition = -1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
posts.Add(new Post() { title = "title 1", isselect = false });
posts.Add(new Post() { title = "title 2", isselect = false });
posts.Add(new Post() { title = "title 3", isselect = false });
posts.Add(new Post() { title = "title 4", isselect = false });
posts.Add(new Post() { title = "title 5", isselect = false });
posts.Add(new Post() { title = "title 6", isselect = false });
posts.Add(new Post() { title = "title 7", isselect = false });
posts.Add(new Post() { title = "title 8", isselect = false });
SetContentView(Resource.Layout.activity_main);
listview = FindViewById<ListView>(Resource.Id.ListView);
listview.ItemClick+= OnListItemClick;
adapter= new CusotmListAdapter(this, posts);
listview.Adapter = adapter;
}
private void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
if(oldposition!=-1)
{
Post p1 = adapter[oldposition];
p1.isselect = false;
}
oldposition = e.Position;
Post p = adapter[e.Position];
p.isselect = true;
adapter.NotifyDataSetChanged();
}
}
更新
您可以更改 CusotmListAdapter GetView 事件中的一些代码:
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
// re-use an existing view, if one is available
// otherwise create a new one
if (view == null)
view = context.LayoutInflater.Inflate(Resource.Layout.ListItemRow, parent, false);
Post item = this[position];
view.FindViewById<TextView>(Resource.Id.textView1).Text = item.title;
ProgressBar p = view.FindViewById<ProgressBar>(Resource.Id.progressBar1);
p.Max = 100;
p.Progress = 100;
//p.IncrementProgressBy(-10);
if(item.isselect==true)
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Visible;
new Thread(new ThreadStart(delegate
{
while (p.Progress > 0)
{
p.Progress -= 20;
Thread.Sleep(1000);
}
})).Start();
}
else
{
view.FindViewById<ProgressBar>(Resource.Id.progressBar1).Visibility = ViewStates.Invisible;
}
return view;
}
那请看截图: