带有自定义列表的进度条

Posted

技术标签:

【中文标题】带有自定义列表的进度条【英文标题】:Progress Bar with Custom List 【发布时间】:2018-04-04 03:19:31 【问题描述】:

嘿,我正在尝试使用持有人模式实现自定义电影列表。目前,我正在成功显示列表。我想在加载唯一活动之前显示一个带有一些消息的进度条。我似乎无法用异步任务将我的头绕在进度条上,我已经遵循了一些示例,但似乎无法理解它们,有人可以建议在哪里插入什么以及插入什么以使其工作。我真的很感激。

这是我唯一的活动

 public class MovieRatingsActivity extends ListActivity
    
    private ArrayList<Movie> movies = new ArrayList<Movie>();
    private LayoutInflater mInflater;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initializeUI();
    

    private void initializeUI()
    
        mInflater = (LayoutInflater) 
           this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);      
        InputStream inputStream = getResources().openRawResource(   R.raw.ratings);
        movies = Movie.loadFromFile(inputStream);       
        setListAdapter(new RowIconAdapter(this, R.layout.listrow, R.id.row_label, movies));
    

    //declare a static holder class
    public static class ViewHolder
        ImageView icon;
        TextView movieText,votesText;
    

    /** Custom row adatper -- that displays an icon next to the movie name */
    class RowIconAdapter extends ArrayAdapter<Movie> 
    
        private ArrayList<Movie> movies;        
        public RowIconAdapter(Context c, int rowResourceId, int textViewResourceId, 
                ArrayList<Movie> items)
        
            super(c, rowResourceId, textViewResourceId, items);
            movies  = items;
        

        public View getView(int pos, View convertView, ViewGroup parent)
        

            //declare a holder object
            ViewHolder holder;
            Movie currMovie = movies.get(pos);

            //nly inflate view once and get all the views once
            if (convertView == null)
            
                convertView = mInflater.inflate(R.layout.listrow, parent, false);
                holder = new ViewHolder();
                holder.icon = (ImageView) convertView.findViewById(R.id.row_icon);
                holder.movieText = (TextView) convertView.findViewById(R.id.row_label);
                holder.votesText= (TextView) convertView.findViewById(R.id.row_subtext);

                //set the holder class
                convertView.setTag(holder);
            

            else
                //get all the views once done
                holder = (ViewHolder) convertView.getTag();
            

            //set all the values in the list
            holder.movieText.setText(currMovie.getName());
            String votesStr = currMovie.getVotes()+" votes";
            holder.votesText.setText(votesStr);
            Bitmap movieIcon = getMovieIcon(currMovie.getName(), currMovie.getRating());
            holder.icon.setImageBitmap(movieIcon);

            return convertView;
        
    

我的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_>
    <ListView
        android:id="@android:id/list" 
        android:layout_  
        android:layout_ />
</LinearLayout>

任何帮助将不胜感激。

【问题讨论】:

您可以在运行服务获取数据时插入进度条,完成后关闭进度条。 您能否展示一个带有异步任务的示例代码,因为我觉得这很难理解?干杯 我添加了答案,您将通过它了解如何在代码中使用进度条功能, 【参考方案1】:

onPreExecute 中初始化您的进度条并执行以下操作:

 @Override
protected void onPreExecute() 
    super.onPreExecute();
    try 
        createProgressBar(context);   // add methodology of your progressbar here,     
       
    catch (Exception e)
        Log.d(TAG, "Exception: >> "+e.toString());
    

onPostExecute得到结果后关闭进度条

   @Override
protected void onPostExecute(Object o) 
    super.onPostExecute(o);

    try 
        cancelProgressBar();   // here add your progressbar to be dismissed.
    catch (Exception e)
        Log.d(TAG, "Exception: >> "+e.toString());
    

    Log.d(TAG, "On_Post");

我希望它能让你知道如何做到这一点。

【讨论】:

【参考方案2】:

在启动加载栏时创建一个异步任务,当异步任务完成后,只需将其关闭。

公共类 MyAsync 扩展 AsyncTask>

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        //Show you progress bar
    

    @Override
    protected Void doInBackground(Void... voids) 
          InputStream inputStream = getResources().openRawResource(   
                R.raw.ratings);
          movies = Movie.loadFromFile(inputStream);            
          return movies;
    

    @Override
    protected void onPostExecute(Void aVoid) 
        super.onPostExecute(aVoid);
        //Hide your progress bar.
        setListAdapter(new RowIconAdapter(this, R.layout.listrow, R.id.row_label, movies));

    

然后在您的 OnCreate 或您想要显示电影列表的任何位置调用此 AsyncTask。

【讨论】:

快速提问这个异步任务采用什么类型的参数,目的是什么? 看看这个教程:vogella.com/tutorials/AndroidBackgroundProcessing/… 嘿,我试过这段代码,但它打破了列表:( @Fakher drive.google.com/open?id=0B9JFJYA09Kn6Ums3V29WZjYtd2M 破单是什么意思??

以上是关于带有自定义列表的进度条的主要内容,如果未能解决你的问题,请参考以下文章

自定义圆形进度条 自定义倒计时进度条

C# WinForm自定义进度条

如何制作WinForm中自定义进度条

使用 Xamarin Forms 在 UWP 中自定义进度条颜色

CSS实现不规则自定义进度条效果

Android自定义View实现可拖拽的进度条