列表视图中的Android进度对话框(Android Progress dialog within

2019-09-27 05:35发布

我的应用程式如下:

主要活动使用的动作条

第一个选项卡是被分成3个部分的片段

| 线性布局包含列表视图| |线性布局包含列表视图| | 线性布局包含媒体控制和图像视图|

我有一个与媒体的控制开始填充图像视图(专辑封面)这个活动,一个充满中心列表视图,另外在两个AsyncTasks。

上述这些问题都运作良好。 列表视图的AsyncTask抛出一个进度对话框纺车。 这是在屏幕的中心上来。 我明白,我可以把这个微调到应用程序的右上角。 但是,我可以将它放在列表的顶部右视图线性布局,或者在线性布局背面中心? 这样,什么应用到进度条那就不显眼但很明显?

提前致谢

Answer 1:

我明白,我可以把这个微调到应用程序的右上角。 但是,我可以将它放在列表的顶部右视图线性布局,或者在线性布局背面中心?

如果你可以计算出视图的位置,你可能能够定位ProgressDialog您希望(例如看到这个问题我回答的代码进度的改变位置 )。 另外,请记住,这可能是谁也看到放置在一些奇怪的位置对话框,对话框屏幕的用户而言是非常反直觉的(他可能不会做出的位置之间的相关ProgressDialog和视图,其数据被加载)。

另一个选项可以是修改当前布局为ListView一部分在顶部的初始了添加FrameLayout (其将覆盖整个ListView )与模拟用于与一个屏幕的背景的背景Dialog (此FrameLayout将包含一个ProgressBar置于你想在哪里)。 这FrameLayout将作出可见当年AsyncTask在踢(它可能是明智的,阻碍触摸事件的强调ListView )。 通过这种方式,用户仍然可以做的东西在你的应用程序,它具有的明确指示View正在加载其数据。 当然,这将工作做好,如果有可能,为用户与其他数据独立于装载工作ListView



Answer 2:

从Luksprog答案是如此之好,我想我应该在这里列出代码:绝对完美main_layout.xml

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

<ListView
    android:id="@+id/first_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/anchor" >
</ListView>

<View
    android:id="@id/anchor"
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:layout_centerVertical="true"
    android:background="#99cc00" />


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/anchor" >

    <ListView
        android:id="@+id/second_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@+id/overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#33c1c1c1"
        android:visibility="gone" >

        <ProgressBar
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|top"
            android:indeterminate="true" />
    </FrameLayout>
</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {

private String[] mItems = { "Item no.1", "Item no.2", "Item no.3",
        "Item no.4", "Item no.5", "Item no.6", "Item no.7", "Item no.8",
        "Item no.9", "Item no.10", "Item no.11", };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
    // setup the two ListViews
    ListView firstList = (ListView) findViewById(R.id.first_list);
    firstList.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, mItems));
    firstList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // just as an example, one you click an item in the first
            // ListView
            // a custom AsyncTask will kick in to load data in to the second
            // ListView
            new MyTask(MainActivity.this).execute((Void) null);
        }
    });
    ListView secondList = (ListView) findViewById(R.id.second_list);
    secondList.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, mItems));
    secondList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // just to test that you can't click the ListView if the data is
            // loading
            Toast.makeText(getApplicationContext(), "click",
                    Toast.LENGTH_SHORT).show();
        }
    });
}

private class MyTask extends AsyncTask<Void, Void, Void> {

    private MainActivity mActivity;
    private FrameLayout mFrameOverlay;

    public MyTask(MainActivity activity) {
        mActivity = activity;
    }

    @Override
    protected void onPreExecute() {
        // the AsyncTask it's about to start so show the overlay
        mFrameOverlay = (FrameLayout) mActivity.findViewById(R.id.overlay);
        // set a touch listener and consume the event so the ListView
        // doesn't get clicked
        mFrameOverlay.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                return true;
            }
        });
        mFrameOverlay.setVisibility(View.VISIBLE);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // do heavy work
        try {
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        //remove the overlay
        mFrameOverlay.setVisibility(View.GONE);
        // setup the ListView with the new obtained data
        String[] obtainedData = { "D1", "D2", "D3" };
        ListView theList = (ListView) mActivity
                .findViewById(R.id.second_list);
        theList.setAdapter(new ArrayAdapter<String>(mActivity,
                android.R.layout.simple_list_item_1, obtainedData));
    }

}
}

Luksprog,希望你不介意我可以发布您的代码,只是不希望它从git的消失,这个答案输给别人。



文章来源: Android Progress dialog within listview