尝试更新列表视图android中按钮的可见性



我已经在安卓系统中开发这个聊天应用程序好几个月了,像大多数人一样使用firebase。最近我一直在添加录音,在这方面我没有任何问题。当我试图用媒体播放器播放/暂停并显示录制音频的进度的布局来扩展列表视图时,就会出现问题。该布局有两个按钮,"播放"one_answers"暂停",当我点击它们时,它们可以互换可见性。当我点击按钮时,问题出现了,不同记录的列表视图项目的按钮可见性会更新,而不是更改相应的列表视图项。我不认为我的适配器实现了视图持有者模式,但我看到类似的项目在没有它的情况下运行得很好。我对可能出现的问题一无所知。此外,为了使列表视图按钮可点击,我在膨胀布局的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();
}
}
}

是我做错了什么还是我错过了什么?我对此还很陌生:/我会感谢任何帮助我解决代码问题的人。提前感谢:(

我得到了解决方案,显然这背后的原因是没有实现视图持有者模式。我做到了,它就像一种魅力:(来自未来的人们注意:-永远不要使用列表视图,回收器视图更先进、更可靠。-始终执行视图保持架模式。

最新更新