public static interface AdapterView.OnItemClickListener

本文深入探讨了Android中AdapterView.OnItemClickListener接口的结构、概述及关键方法,包括如何使用回调函数处理点击事件,以及如何访问与被选项相关的数据。

正文

  一、结构

public static interface AdapterView.OnItemClickListener

        

直接子类

         CharacterPickerDialog, PreferenceScreen

 

  二、概述

    这个接口定义了当AdapterView中一元素被点击时,一个回调函数被调用。

 

  三、公共方法

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

         当AdapterView中一元素被点击时,回调方法被调用。

  如果需要访问与被选项相关的数据,执行程序可以调用getItemAtPosition(position)。

  参数

                    parent     发生点击动作的AdapterView。

        view        在AdapterView中被点击的视图(它是由adapter提供的一个视图)。

              position 视图在adapter中的位置。

     id            被点击元素的行id。

package com.example.diary03; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.Button; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; public class DiaryAdapter extends RecyclerView.Adapter<DiaryAdapter.ViewHolder> { private Context context; private ArrayList<Diary> diaryList; private AdapterView.OnItemClickListener itemClickListener; private OnEditClickListener editClickListener; private OnDeleteClickListener deleteClickListener; // 添加修改按钮回调接口 public interface OnEditClickListener { void onEditClick(int position); } public interface OnDeleteClickListener { void onDeleteClick(int position); } public void setOnEditClickListener(OnEditClickListener listener) { this.editClickListener = listener; } public void setOnDeleteClickListener(OnDeleteClickListener listener) { this.deleteClickListener = listener; } public DiaryAdapter(Context context, ArrayList<Diary> diaryList) { this.context = context; this.diaryList = diaryList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context) .inflate(R.layout.diary_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Diary diary = diaryList.get(position); holder.tvTitle.setText(diary.getTitle()); holder.tvContentPreview.setText(diary.getContent()); holder.tvDate.setText(diary.getCreatedAt()); // 设置修改按钮点击事件 holder.btnEdit.setOnClickListener(v -> { if (editClickListener != null) { editClickListener.onEditClick(position); } }); // 设置删除按钮点击事件 holder.btnDelete.setOnClickListener(v -> { if (deleteClickListener != null) { deleteClickListener.onDeleteClick(position); } }); } @Override public int getItemCount() { return diaryList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { TextView tvTitle; TextView tvContentPreview; TextView tvDate; Button btnEdit,btnDelete; public ViewHolder(View itemView) { super(itemView); tvTitle = itemView.findViewById(R.id.tv_title); tvContentPreview = itemView.findViewById(R.id.tv_content_preview); tvDate = itemView.findViewById(R.id.tv_date); btnEdit = itemView.findViewById(R.id.btn_edit); btnDelete = itemView.findViewById(R.id.btn_delete); } } }时间显示不正确应该如何修改
06-08
package com.dosen.watchtest.activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.dosen.watchtest.R; import com.dosen.watchtest.widget.WatchListView; import java.util.ArrayList; import java.util.List; /** * Created by Daisy */ public class RingtonePickerActivity extends SecondaryActivity { private static final String TAG = "RingtonePickerActivity"; public static void start(Context context) { Intent starter = new Intent(context, RingtonePickerActivity.class); context.startActivity(starter); } private WatchListView watchListView; private RingtoneAdapter adapter; private List<RingtoneItem> ringtoneItems = new ArrayList<>(); private Ringtone currentRingtone; private int selectedPosition = -1; private Uri currentRingtoneUri; private Cursor cursor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ringtone_picker); currentRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE); watchListView = findViewById(R.id.ringtone_list); getSystemRingtones(); adapter = new RingtoneAdapter(this, ringtoneItems); watchListView.setAdapter(adapter); watchListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { handleRingtoneSelection(position); } }); setDefaultSelection(); } private class RingtoneAdapter extends BaseAdapter { private final Context context; private final List<RingtoneItem> items; public RingtoneAdapter(Context context, List<RingtoneItem> items) { this.context = context; this.items = items; } @Override public int getCount() { return items.size(); } @Override public Object getItem(int position) { return items.get(position); } @Override public long getItemId(int position) { return position; } class ViewHolder { TextView tvName; ImageView ivSelected; } @Override public View getView(int position, View view, ViewGroup viewGroup) { ViewHolder holder; if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.ringtone_list_item, viewGroup, false); holder = new ViewHolder(); holder.tvName = view.findViewById(R.id.tv_ringtone_name); holder.ivSelected = view.findViewById(R.id.iv_ringtone_selected); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } RingtoneItem item = items.get(position); holder.tvName.setText(item.title); if (item.selected) { holder.tvName.setTextColor(getResources().getColor(R.color.white)); holder.ivSelected.setImageResource(R.drawable.ic_radio_button_checked); } else { holder.tvName.setTextColor(getResources().getColor(R.color.text_hui)); holder.ivSelected.setImageResource(R.drawable.ic_radio_button_unchecked); } return view; } } /** * 获取系统铃声 */ private void getSystemRingtones() { ringtoneItems.clear(); RingtoneManager manager = new RingtoneManager(this); manager.setType(RingtoneManager.TYPE_RINGTONE); cursor = manager.getCursor(); if (cursor != null && cursor.moveToFirst()) { do { String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX); Uri uri = manager.getRingtoneUri(cursor.getPosition()); ringtoneItems.add(new RingtoneItem(title, uri)); } while (cursor.moveToNext()); cursor.close(); } } /** * 查找当前铃声在列表中的位置 */ private void setDefaultSelection() { for (int i = 0; i < ringtoneItems.size(); i++) { if (ringtoneItems.get(i).uri.equals(currentRingtoneUri)) { selectedPosition = i; ringtoneItems.get(i).selected = true; break; } } adapter.notifyDataSetChanged(); } /** * 设置选中的铃声 */ private void handleRingtoneSelection(int position) { RingtoneItem selectedItem = ringtoneItems.get(position); // 停止当前播放的铃声 if (currentRingtone != null && currentRingtone.isPlaying()) { currentRingtone.stop(); } // (重新)播放选中的铃声 currentRingtone = RingtoneManager.getRingtone(this, selectedItem.uri); currentRingtone.play(); // 更新选中状态 if (selectedPosition != -1) { ringtoneItems.get(selectedPosition).selected = false; } selectedItem.selected = true; selectedPosition = position; setAsDefaultRingtone(selectedItem.uri); adapter.notifyDataSetChanged(); } /** * 设置为系统默认铃声 * * @param uri 铃声Uri */ private void setAsDefaultRingtone(Uri uri) { try { RingtoneManager.setActualDefaultRingtoneUri( this, RingtoneManager.TYPE_RINGTONE, uri ); Log.d(TAG, "Ringtone set successfully: " + uri.toString()); } catch (SecurityException e) { Log.e(TAG, "Failed to set ringtone: " + e.getMessage()); // 处理权限问题 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { if (!Settings.System.canWrite(this)) { // 请求写入设置权限 Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); } } } catch (Exception e) { Log.e(TAG, "Exception setting ringtone: " + e.getMessage()); } } /** * 铃声项数据类 * * @title 铃声名称 * @uri 铃声Uri * @selected 是否选中 */ private static class RingtoneItem { String title; Uri uri; boolean selected; public RingtoneItem(String title, Uri uri) { this.title = title; this.uri = uri; this.selected = false; } } @Override protected void onDestroy() { super.onDestroy(); if (currentRingtone != null && currentRingtone.isPlaying()) { currentRingtone.stop(); } if (cursor != null) { cursor.close(); } } } 上述代码出现了Android StaleDataException: Attempted to access a cursor after it has been closed 的报错,请帮忙优化修改
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值