【问题标题】:ListView item as a progress barListView 项目作为进度条
【发布时间】:2019-11-19 15:39:53
【问题描述】:

我想知道是否有人可以帮助我实现以下意图:

我创建了一个只显示表格的应用。它显示了一个表头以及一个包含多个项目的列表视图。

是否有可能,如果单击其中一项,会显示一个进度条,该进度条会在一定的时间间隔(比如说 30 秒)内从左到右平滑加载?

请看下面我的截图,也许更容易理解我想要做什么:

最后,我不知道它是否有帮助,但我也附上一些代码。我将其缩短了一点,如果缺少某些内容以供理解(例如列表类)或删除太多,请告诉我:

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;        
    }
}

谁能给我一个简短的提示或什么?我怎样才能为点击的每个项目实现这样的进度条?^^ 会很高兴为每一个帮助的努力。

提前感谢您的每一个回答,

最好的问候

【问题讨论】:

    标签: list listview xamarin.android progress-bar listadapter


    【解决方案1】:

    是否有可能,如果单击其中一项,会显示一个进度条,该进度条会在一定的时间间隔(比如说 30 秒)内从左到右平滑加载?

    如果你想在点击Listview项时显示进度条,我给你做了一个例子,你可以看看:

    1.声明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.声明列表行布局

    <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.定义ListView适配器

    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;
        }
    
    }
    
    1. 设置 ListView 适配器

      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;
        }
    

    那么请看截图:

    【讨论】:

    • 您好@Cherry Bu - MSFT,非常感谢您的回答和样品。好的,我更想在一行的背景中显示 ProgressBar,但由于这也有效,我可以在每行的底部显示 ProgressBar。不幸的是,这只是我问题的一半,现在是困难的部分^^:我怎样才能做到,如果单击特定行,单击的行的 ProgressBar 在特定时间间隔内平滑加载(例如 30秒)从 100%(右)到 0%(左)?
    • @Sam,请看我的更新,请记得将我的回复标记为答案,如果我的回复对您有帮助,谢谢。
    【解决方案2】:

    很明显,您缺少一些关于 ListViews 的知识。这个Xamarin university course 有一些例子和一个解释不同组件的视频。

    但基本上,您可以将您的background progress bar 作为View 放入您的row AXML 布局文件中,并且根据Progress 属性的值,该视图可以更改宽度。

    如果您有任何问题,请告诉我

    【讨论】:

    • 是的,我真的很抱歉,因为我只是学生实习生,所以有点缺乏知识。我现在将 ProgressBar 作为View 放在我的Row.axml 文件中。我可以通过SetProgress() 更改宽度(我有一个适配器(var pb = v.FindViewById; pb.SetProgress();)并做了类似RunOnUiThread(() =&gt; {adapter.progress = 25; adapter.NotifyDataSetChanged();}); 的操作,但是如何在一定的时间间隔内平滑地更改宽度?我必须创建一个System.Timers.Timer /只需每毫秒调用一次SetProgress(),希望眼睛足够慢,似乎可以顺利加载?
    猜你喜欢
    • 2012-05-20
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多