android - 如何在 android studio 中创建自定义数组适配器以禁用对列表视图项的点击
问题描述
当前的 Uni 学生,我正在尝试创建一个扩展 ArrayAdapter 类的自定义数组适配器类,以便我可以禁用对列表视图中选定项目的单击。
我不确定如何实现这个新类,这是我到目前为止所拥有的
package com.example.assignment1;
import android.content.Context;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
public class customAdapter extends ArrayAdapter {
public customAdapter(@NonNull Context context, int resource) {
super(context, resource);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
// return super.isEnabled(position);
}
}
我也不确定如何编写 isEnabled 函数:
这就是我打算如何使用这个功能
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
poss = position + 1;
AlertDialog.Builder builder = new AlertDialog.Builder(viewFriends.this);
builder.setTitle("Notice");
builder.setMessage("Please select to to edit, delete a friend or cancel");
// add the buttons
builder.setPositiveButton("Edit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//System.out.println(poss);
Intent intent = new Intent(getApplicationContext(), editOrDelete.class);
ArrayList<String> result1 = mydb.retrieveRow(poss);
name = result1.get(1);
age = result1.get(2);
gender = result1.get(3);
address = result1.get(4);
code = result1.get(0);
intent.putExtra("code", code);
intent.putExtra("name", name);
intent.putExtra("age", age);
intent.putExtra("gender", gender);
intent.putExtra("address", address);
startActivity(intent);
}
});
builder.setNeutralButton(" Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println(poss);
mydb.updateDeleted(poss);
if(listView.getChildAt(position).isEnabled())
{
listView.getChildAt(position).setEnabled(false);
// function to disable clicks
}
}
});
builder.setNegativeButton("Cancel", null);
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
public void displayFriendList() {
ArrayList<String> result = mydb.retrieveRows();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, result);
listView.setAdapter(adapter);
}
因此,当用户单击警报中的删除按钮时,我想将他们在列表视图中单击的项目变灰(我设法实现了这一点),但我也希望它一旦无法被单击已被删除
以及如何实现这一目标的建议?
解决方案
而不是使用常规ListView
使用自定义:
1)创建一个CustomListView
类:
public class CustomListView extends ListView{
//add these three constructors
public CustomListView(Context context){
super(context);
}
public CustomListView(Context context , AttributeSet attrs){
super(context , attrs);
}
public CustomListView(Context context , AttributeSet attrs, int defStyleAttr){
super(context , attrs, defStyleAttr);
}
//handle the item click
@Override
public boolean performItemClick(View view , int position , long id){
if(!view.isEnabled()){
//don't handle the click
return false;
}else{
//handle the click
return super.performItemClick(view, position, id);
}
}
}
将
CustomListView
您创建的内容添加到 xml 布局中,而不是ListView
.代替:
ListView listView = findViewById(.......);
经过:
CustomListView listView = findViewById(.......);
CustomAdapter
2)从你的类中删除这些方法:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
// return super.isEnabled(position);
}
3)像这样处理项目点击:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) {
poss = position + 1;
AlertDialog.Builder builder = new AlertDialog.Builder(viewFriends.this);
builder.setTitle("Notice");
builder.setMessage("Please select to to edit, delete a friend or cancel");
// add the buttons
builder.setPositiveButton("Edit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//.......keep whatever you have the same here
}
});
builder.setNeutralButton(" Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//disable the view so that you won't receive clicks again
view.setEnabled(false);
}
});
builder.setNegativeButton("Cancel", null);
AlertDialog dialog = builder.create();
dialog.show();
}
});
如果您使用上述实现,那么当您单击警报对话框中的删除按钮时,该项目将不会收到下一次单击事件。
推荐阅读
- r - 添加唯一标识符
- javascript - 对于每个单元格循环 - Excel JavaScript API
- go - 如何将golang中的接口列表连接成一张大地图?
- python - 使用 Selenium 和 Python 选择子菜单 href 的问题
- typescript - 装饰器可以更改方法的签名吗?
- ios - 如何使用 NSPredicate 在 Swift 5 中使用 CoreData 搜索关系属性的 ObjectID?
- sql-server - SQL Server 管理工作室调试器错误
- php - 通过 AJAX 将 url 字符串发送到 PHP
- django - 空查询返回数据库中的所有字段。姜戈
- oracle - 更新表时如何在oracle上转义破折号