【问题标题】:Android - setVisibility not working in ProgressBarAndroid - setVisibility 在 ProgressBar 中不起作用
【发布时间】:2015-05-02 23:46:20
【问题描述】:

我有一个包含进度条的 ListView,我想在线程中显示和隐藏进度条,这是我的代码:

public void onClick(View v) {
    if (v.getId() == R.id.ib_add_file) {
        Intent intent = new Intent(this, FilePickerActivity.class);
        startActivityForResult(intent, REQUEST_PICK_FILE);
    }
}

当我选择一个文件时,它将被添加到 ListView 并开始上传:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
        case REQUEST_PICK_FILE:
            if (data.hasExtra(FilePickerActivity.EXTRA_FILE_PATH)) {
                File file = new File(data.getStringExtra(FilePickerActivity.EXTRA_FILE_PATH));
                Fichier fichier = new Fichier();
                fichier.setFile(file);
                ArrayAdapter<Message> adapter = (ArrayAdapter<Message>) chat_list.getAdapter();
                adapter.add(fichier);
                int pos = adapter.getCount() - 1;
                MessageHolder holder = (MessageHolder) getViewByPosition(pos, chat_list).getTag();
                Log.i("Fichier", holder.fichier.getText().toString());
                //the log is showing the right file name
                holder.progress.setVisibility(View.VISIBLE);
                //the progressBar isn't showing !
                Log.i("ProgressBar", (holder.progress.getVisibility() == View.VISIBLE)? "Visible":"invisible");
                //the log is showing Visible !!!
            }
        }
    }
}

我正在使用从 answer 获得的这个函数来从 ListView 中获取添加的行来处理 ProgressBar:

public View getViewByPosition(int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
    if (pos < firstListItemPosition || pos > lastListItemPosition) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    MessageHolder msgHolder = null;
    Message msg = data.get(position);
    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        msgHolder = new MessageHolder();
        msgHolder.fichier = (TextView) row.findViewById(R.id.tv_fichier);
        msgHolder.iconFichier = (ImageView) row.findViewById(R.id.iv_icon_fichier);
        msgHolder.progress = (ProgressBar) row.findViewById(R.id.pb_fichier);
        row.setTag(msgHolder);
        //msgHolder.handler = new ProgressBarHandler(msgHolder.progress);
    } else {
        msgHolder = (MessageHolder) row.getTag();
    }
    Fichier fich = (Fichier) msg;
    msgHolder.fichier.setText(fich.getNomFichier());
    msgHolder.fichier.setPaintFlags(msgHolder.fichier.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
    msgHolder.iconFichier.setImageResource(fichier.getIconFichier());
    return row;
}

private static class MessageHolder {
    ImageView iconFichier;
    TextView fichier;
    ProgressBar progress;
    ProgressBarHandler handler;
}

这是我的列表视图行的 xml:

<ImageView
android:id="@+id/iv_icon_fichier"
style="@style/AvatarImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/descThumbnail"
android:scaleType="centerCrop" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/iv_icon_fichier"
android:orientation="vertical" >

     <TextView
     android:id="@+id/tv_fichier"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textStyle="bold"
     android:textSize="22sp"
     android:text="Fichier" />

     <ProgressBar
     android:id="@+id/pb_fichier"
     style="?android:attr/progressBarStyleHorizontal"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:max="100"
     android:minWidth="200dp"
     android:progress="0"
     android:visibility="gone"/>
</LinearLayout>

为什么我的 ProgressBar 没有显示?

代码已编辑:我意识到我的问题与处理程序无关,我尝试直接从我的 onActivityResult 方法显示 ProgressBar,但它没有显示!

【问题讨论】:

  • 试试这个public ProgressBarHandler(ProgressBar progressBar) {super(Looper.getMainLooper()); this.progressBar = progressBar; }看看有没有帮助
  • 感谢您的回复,我已经编辑了我的代码,我的问题与 Handler 无关,看看我新的 onActivityResult 代码。
  • 你试过设置进度吗?比如:holder.progress.setProgress(50);
  • 它也不起作用......
  • 是的,它不起作用我只是忘记了,我从来没有关注过其他帖子。我会尝试发布答案好的先生

标签: android android-progressbar


【解决方案1】:

这是ListView 的父母

↳   android.view.ViewGroup
       ↳    android.widget.AdapterView<android.widget.ListAdapter>
           ↳    android.widget.AbsListView

看着我什至会说我会打电话给mylistView.removeViewAt(3);,这应该是因为ViewGroup,但不是因为AdapterView.. 为什么我这么说是因为,我不是天才,那个帖子有 44 个赞,这意味着它是合法的,但我认为如果你想挑出更新一个由一个支持的 View AdapterView 因为getView 方法将覆盖它您的更改,即使发生更改,它也不一定发生在您首选的View View 在位置0 是View 的其余部分开始绘制从。例如,如果您有一个初始的View 和一个可见的TextView 和一个不可见的EditText,那么所有Views 都将是这样,除非您在getView 返回之前更改一个View(我以前没有使用过那种方法/方式,我说的是支持的假设),所以改为在你的数据源中放入另一个变量,如 boolean needsupdate 并检查 getView 中的 needsupdate 并更改 @987654341 @ 那里。这将是我的智力的合法途径-(也许我可能有点偏离这里)。不过试试看

【讨论】:

  • 感谢您的回复,但我真的很难理解您的意思,我应该在哪里添加需求更新变量以及我应该如何使用它?
  • 在你的数据对象中,就像你有一个类是你的数据对象,就像这个公共类 source{boolean needsupdate;字符串名称;} 等等等等,你明白吗?在你的情况下,它应该是 Fichier 然后你检查它就像 if(Fichier.needsupdate) // now change the visibility @user3578325
  • 先生是@user3578325
  • 它工作了,但仍然有一些错误,所以我用一个显示百分比的简单文本视图更改了 progressBar,它工作正常,谢谢 :)
  • aww 你应该让我知道,也许我可以提供帮助,但我很高兴你找到了方法。顺便说一句,如果你不是那个投票的人,那么你可以给我一个投票:) 哈哈,如果你没问题@user3578325
【解决方案2】:

您是否尝试过将文件检索代码放入这样的工作线程中?

// set progressBar .VISIBLE first 

// then...    
new Thread(new Runnable() {
            public void run() {

                // file retrieval code

            }
        }).start();

这里是how it solved my own problem,这里是the docs。

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多