在listview项中使用progressBar

时间:2014-08-26 09:07:58

标签: android-fragments android-listview progress-bar

我有这个listview,它是在片段类中编码的。选择列表视图项时,它会转到另一个片段并显示详细信息。但是加载数据需要几秒钟,因为我显示的数据是使用AsyncTask,因此从JSON和显示中获取数据需要一些时间。所以我需要在listview中单击一个项目时使用progressBar,它应该在数据准备好显示时关闭。我怎样才能做到这一点?我参考了几个教程,并尝试了很多教程。但我无法完成我正在寻找的东西。希望你们中的一些人可以帮助我。

NewsFragment class

private ListView listView;
    private ArrayList<BaseElement> News;
    private LazyAdapter adapter;
    private Activity activity;
    private CommonVariable commonVariable;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        final View view = inflater.inflate(R.layout.news_fragment, container,
                false);

        activity = this.getActivity();

        commonVariable = (CommonVariable) activity.getApplication();


        listView = (ListView) view.findViewById(R.id.list);


        listView.setOnItemClickListener(new OnItemClickListener() {

               public void onItemClick(AdapterView<?> parent, View v,
                 int position, long id){ 


                   android.support.v4.app.Fragment detail = new NewsDetailFragment();
                   android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
                   fragmentManager.beginTransaction().add(R.id.content_frame, detail).addToBackStack("back").commit(); 

                }
              });

        new BackGround().execute();

        return view;
    }




public class BackGround extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            News = JSONServices.getNewsDescription();
            return null;
        } 

        @Override
        /* check again */
        protected void onPostExecute(Void result) {

            commonVariable.setNewsDescription(News);

            adapter = new LazyAdapter(News, activity,Element.NEWS_LIST.getType());

            listView.setAdapter(adapter);

            super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

    }

}

NewsDetailFragment

public class NewsDetailFragment extends Fragment {

private View view1;

    private ArrayList<BaseElement> newsdetail;
    private LazyAdapter adapter;
    private Activity activity;
    private CommonVariable commonVariable;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.newsdetail_fragment, container,
                false);

        activity = this.getActivity();


        commonVariable = (CommonVariable) activity.getApplication();

        view1 = (View) view.findViewById(R.id.list);

        new BackGround().execute();

        return view;
    }



public class BackGround extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            newsdetail = JSONServices.getNewsDescription();

            return null;

        } 

@SuppressWarnings("unchecked")
@Override
        /* check again */
        protected void onPostExecute(Void result) {

            commonVariable.setTheater(newsdetail);

            adapter = new LazyAdapter(newsdetail, activity,Element.NEWS_DETAIL.getType());

            ((AdapterView<ListAdapter>) view1).setAdapter(adapter);

            super.onPostExecute(result);
        }

@Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

    }
}

新闻列表布局

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/grey"
     >


    <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="@drawable/listview" >

       <ImageView
        android:id="@+id/thumb_image"
        android:layout_width="150dp"
        android:layout_height="120dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="1dp"
        android:layout_marginBottom="1dp"


        /> 


        <TextView
        android:id="@+id/news_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:layout_toRightOf="@+id/thumb_image"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="7dp"
        android:textStyle="bold"
        android:textSize="20dp" />

    <!--  <TextView
        android:id="@+id/news_description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textStyle="bold"
        android:layout_below="@+id/news_title"
        android:textSize="15dp" />   -->

    </LinearLayout>

</RelativeLayout>

NewsFragment布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
     android:background="@color/grey" >


  <!--  <GridView
        android:id="@+id/gridView2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:numColumns="2"
        android:stretchMode="columnWidth" 
        android:layout_margin="5dp"
        android:columnWidth="100dp"/>   --> 

        <ListView
              android:id="@+id/list"
              android:layout_height="match_parent"
              android:layout_width="match_parent"
              android:dividerHeight="10dp"
              android:layout_margin="6dp">
         </ListView>

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

ProgressBar添加到您的NewsFragment布局:

<ProgressBar 
    android:id="@+id/progress_bar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:indeterminate="true"
    android:visibility="gone" />

然后在onItemClick方法中将其可见性更改为true progressBar.setVisibility(View.VISIBLE)以显示它,并将其可见性更改为false,以在progressBar.setVisibility(View.GONE)的AsyncTask中隐藏onPostExecute

答案 1 :(得分:0)

好的,我现在明白了。我像这样修改了我的第二个片段。单击列表视图中的项目时,它会转到我的第二个类。所以我在第二个类中添加了一个progressBar并且它有效!

public class NewsDetailFragment extends Fragment {

private View view1;

    private ArrayList<BaseElement> newsdetail;
    private LazyAdapter adapter;
    private Activity activity;
    private CommonVariable commonVariable;
    private ProgressDialog dialog;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.newsdetail_fragment, container,
                false);

        activity = this.getActivity();


        commonVariable = (CommonVariable) activity.getApplication();

        view1 = (View) view.findViewById(R.id.list);

        dialog = new ProgressDialog(NewsDetailFragment.this.getActivity());
        dialog.setMessage("Loading News");
        dialog.setCancelable(true);

        new BackGround().execute();

        return view;
    }



public class BackGround extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            newsdetail = JSONServices.getNewsDescription();

            return null;

        } 

@SuppressWarnings("unchecked")
@Override
        /* check again */
        protected void onPostExecute(Void result) {

            commonVariable.setTheater(newsdetail);

            adapter = new LazyAdapter(newsdetail, activity,Element.NEWS_DETAIL.getType());

            ((AdapterView<ListAdapter>) view1).setAdapter(adapter);

            dialog.dismiss();

            super.onPostExecute(result);
        }

@Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub

    dialog.show();
            super.onPreExecute();
        }

    }

}