【问题标题】:Trying to update visibility of buttons in a list view android尝试更新列表视图android中按钮的可见性
【发布时间】:2020-10-28 11:43:06
【问题描述】:

几个月来,我一直在安静地使用 Android 中的这个聊天应用程序,像大多数人一样使用 Firebase。最近我一直在努力添加录音,我对此没有任何问题。当我尝试使用媒体播放器播放/暂停和显示录制音频进度的布局来扩展列表视图时,就会出现问题。布局有两个按钮,播放和暂停,当我单击它们时,它们会互换可见性。当我单击按钮时出现问题,不同记录的列表视图项目的按钮可见性被更新,而不是更改相应的列表视图项目。我不认为我的适配器实现了视图持有者模式,但我已经看到类似的项目在没有它的情况下工作得很好。我对可能是什么问题一无所知。此外,为了使列表视图按钮可点击,我在膨胀布局的 xml 中添加了以下行 (android:descendantFocusability="blocksDescendants"),这在我所做的另一个项目中运行良好。 我录制的音频列表视图的适配器代码:

 else if(map.get("TYPE").toString().contains("RECORDING")){
        if (map.get("FROM").toString().contains(mAuth.getUid())) {
            convertView = inflater.inflate(R.layout.recording_user_list, null);
        }
        else {
            convertView = inflater.inflate(R.layout.message_image_layout_other, null);
        }

        TextView mTime = convertView.findViewById(R.id.list_recording_received_time);
        mTime.setText(time);
        finalRecorderPath = Environment.getExternalStorageDirectory().getAbsolutePath() +
                "/" + map.get("MESSAGE").toString();

        playButton = convertView.findViewById(R.id.list_view_recording_play);
        pauseButton = convertView.findViewById(R.id.list_view_recording_pause);
        pauseButton.setVisibility(View.INVISIBLE);

        if(mediaPlayer != null){
            mediaPlayer.release();
        }
        mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(map.get("MESSAGE").toString());
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }

        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playButton.setVisibility(View.INVISIBLE);
                pauseButton.setVisibility(View.VISIBLE);
                      mediaPlayer.start();
                if(recordingFlag){
                            mediaPlayer.seekTo(audioPosition);
                    Toast.makeText(activity, "Hey", Toast.LENGTH_SHORT).show();
                }
            }

        });

        pauseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playButton.setVisibility(View.VISIBLE);
                pauseButton.setVisibility(View.INVISIBLE);
                audioPosition = mediaPlayer.getCurrentPosition();
                recordingFlag = true;
            }
        });



        Log.e(TAG, "setRecording: Path " + finalRecorderPath );

        Log.e(TAG, "onClick: Playing");
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mediaPlayer.stop();
                audioPosition = 0;
                recordingFlag = false;
                mediaPlayer.release();
                Log.e(TAG, "onCompletion: Completed playing audio");
            }
        });

    }

我膨胀的 xml 布局:

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

    <RelativeLayout
        android:layout_margin="5dp"
        android:layout_alignParentEnd="true"
        android:background="@drawable/text_box_sender"
        android:layout_width="300dp"
        android:layout_height="80dp">

        <ImageButton
            android:focusable="false"
            android:id="@+id/list_view_recording_play"
            android:layout_marginStart="20dp"
            android:layout_centerVertical="true"
            android:background="@color/colorTransparent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_baseline_play_arrow_24"/>

        <ImageButton
            android:focusable="false"
            android:id="@+id/list_view_recording_pause"
            android:layout_marginStart="20dp"
            android:layout_centerVertical="true"
            android:background="@color/colorTransparent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_baseline_pause_24"/>

        <ProgressBar
            android:id="@+id/list_recording_progress_bar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_toEndOf="@+id/list_view_recording_play"
            android:layout_centerVertical="true"
            android:layout_marginStart="30dp"
            android:layout_marginEnd="30dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_alignParentEnd="true"
            android:layout_marginEnd="13dp"
            android:layout_marginBottom="7dp"
            android:textSize="12sp"
            android:textColor="@color/colorWhite"
            android:layout_below="@id/list_view_recording_pause"
            android:id="@+id/list_recording_received_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RelativeLayout>

</RelativeLayout>

我的列表视图适配器完整代码附在下面:

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.example.chatbox.R;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;

public class ChatAdapter extends BaseAdapter {

    String TAG = "Chat Adapter";
    FirebaseStorage storage;
    private ArrayList<HashMap> chatList;
    StorageReference mDataRef;
    private Activity activity;
    FirebaseAuth mAuth = FirebaseAuth.getInstance();
    private MediaPlayer mediaPlayer;
    private String finalRecorderPath;
    private ImageButton playButton, pauseButton;
    int audioPosition;
    private boolean recordingFlag = false;

    public ChatAdapter(Activity activity, ArrayList<HashMap> chatList){
        this.chatList = chatList;
        this.activity = activity;

        storage = FirebaseStorage.getInstance();
        mDataRef = storage.getReferenceFromUrl("gs://chat-box-v2.appspot.com");
    }

    @Override
    public int getCount() {
        return chatList.size();
    }

    @Override
    public Object getItem(int position) {
        return chatList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final HashMap map = chatList.get(position);


        LayoutInflater inflater = activity.getLayoutInflater();

        String time = map.get("TIME").toString();
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = format.parse(time);
            Date currentTime = Calendar.getInstance().getTime();

            format = new SimpleDateFormat("yyyy-MM-dd");
            String chatDate = format.format(date);
            String curDate = format.format(currentTime);

            if (chatDate.contains(curDate)) {
                format = new SimpleDateFormat("hh:mm aa");
                time = format.format(date);
                Log.e(TAG, "Adapter Time Matches");
            } else {
                format = new SimpleDateFormat("dd-MM-yyyy HH:mm aa");
                time = format.format(date);
                Log.e(TAG, "Time doesnt Match");
            }
        } catch (Exception e) {
            Log.e(TAG, "Chat Adapter Time Exception: " + e.toString());
        }

        if(map.get("TYPE").toString().contains("MESSAGE")) {

            if (map.get("FROM").toString().contains(mAuth.getUid()))
                convertView = inflater.inflate(R.layout.sender, null);

            else
                convertView = inflater.inflate(R.layout.reciever, null);

            TextView mName = convertView.findViewById(R.id.user_name_list);
            TextView mMessage = convertView.findViewById(R.id.chat_text_list);
            TextView mTime = convertView.findViewById(R.id.text_time_list);


            /***Date And Time Formatter For List View Chat**/

            try {
                mName.setText(map.get("NAME").toString());
            } catch (Exception e) {
                Log.e(TAG, "getView:  Name" + e.toString());
            }

            try {
                mMessage.setText(map.get("MESSAGE").toString());
                mTime.setText(time);
            } catch (Exception e) {

            }
        }

        else if(map.get("TYPE").toString().contains("IMAGE")){

            if (map.get("FROM").toString().contains(mAuth.getUid()))
                convertView = inflater.inflate(R.layout.message_image_layout_user, null);

            else
                convertView = inflater.inflate(R.layout.message_image_layout_other, null);

            ImageView imageView = convertView.findViewById(R.id.message_image_view);
            ProgressBar progressBar = convertView.findViewById(R.id.progress_circular_bar_image);
            GetImageBitmap(map.get("MESSAGE").toString(), imageView, progressBar);
        }

        else if(map.get("TYPE").toString().contains("RECORDING")){
            if (map.get("FROM").toString().contains(mAuth.getUid())) {
                convertView = inflater.inflate(R.layout.recording_user_list, null);
            }
            else {
                convertView = inflater.inflate(R.layout.message_image_layout_other, null);
            }

            TextView mTime = convertView.findViewById(R.id.list_recording_received_time);
            mTime.setText(time);
            finalRecorderPath = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/" + map.get("MESSAGE").toString();

            playButton = convertView.findViewById(R.id.list_view_recording_play);
            pauseButton = convertView.findViewById(R.id.list_view_recording_pause);
            pauseButton.setVisibility(View.INVISIBLE);

            if(mediaPlayer != null){
                mediaPlayer.release();
            }
            mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource(map.get("MESSAGE").toString());
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }

            playButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    playButton.setVisibility(View.INVISIBLE);
                    pauseButton.setVisibility(View.VISIBLE);
                          mediaPlayer.start();
                    if(recordingFlag){
                                mediaPlayer.seekTo(audioPosition);
                        Toast.makeText(activity, "Hey", Toast.LENGTH_SHORT).show();
                    }
                }

            });

            pauseButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    playButton.setVisibility(View.VISIBLE);
                    pauseButton.setVisibility(View.INVISIBLE);
                    audioPosition = mediaPlayer.getCurrentPosition();
                    recordingFlag = true;
                }
            });



            Log.e(TAG, "setRecording: Path " + finalRecorderPath );

            Log.e(TAG, "onClick: Playing");
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mediaPlayer.stop();
                    audioPosition = 0;
                    recordingFlag = false;
                    mediaPlayer.release();
                    Log.e(TAG, "onCompletion: Completed playing audio");
                }
            });

        }
        return convertView;
    }

    void GetImageBitmap(final String url, final ImageView imageView, final ProgressBar progressBar){
        Log.e(TAG, "GetImageBitmap: " + url );
        final Handler handler = new Handler(Looper.getMainLooper());

        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                FileInputStream fileInputStream;
                Bitmap bitmap = null;
                try {
                    fileInputStream = activity.openFileInput(url);
                    bitmap = BitmapFactory.decodeStream(fileInputStream);
                    final Bitmap finalBitmap = bitmap;
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                progressBar.setVisibility(View.GONE);
                                Drawable drawable = new BitmapDrawable(finalBitmap);
                                imageView.setImageDrawable(drawable);
                                imageView.setDrawingCacheEnabled(true);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    
                    Log.e(TAG, "GetImageBitmap: Bitmap");
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    final StorageReference ref = storage.getReference().child("images/message/" + url);
                    ref.getBytes(1020*1024*7).addOnSuccessListener(new OnSuccessListener<byte[]>() {
                        @Override
                        public void onSuccess(byte[] bytes) {
                            Log.e("TestData", "onSuccess: " + "successfully downloaded image" );
                            Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                            try {
                                Drawable drawable = new BitmapDrawable(bitmap);
                                imageView.setImageDrawable(drawable);
                                imageView.setDrawingCacheEnabled(true);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            saveImage(activity, bitmap, url);
                        }
                    });
                }
            }
        });

    }

    void saveImage(Context context, Bitmap bitmap, String name){
        try {
            FileOutputStream fileOutputStream = context.openFileOutput(name, Context.MODE_PRIVATE);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我做错了什么或者我错过了什么?我对此仍然很陌生:/我将感谢任何帮助我解决我的代码问题的人。在此先感谢:)

【问题讨论】:

    标签: android listview android-mediaplayer audio-recording android-mediarecorder


    【解决方案1】:

    我得到了解决方案,显然这背后的原因是没有实现视图持有者模式。我做到了,它就像一个魅力:) 来自未来的人们注意: - 永远不要使用列表视图,recycler-view 更高级和可靠。 - 始终实现视图持有者模式。

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2014-07-04
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2020-09-11
      • 2013-01-29
      相关资源
      最近更新 更多