首页 > 解决方案 > 如何在 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);
    }

因此,当用户单击警报中的删除按钮时,我想将他们在列表视图中单击的项目变灰(我设法实现了这一点),但我也希望它一旦无法被单击已被删除

以及如何实现这一目标的建议?

标签: android

解决方案


而不是使用常规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);
}

}

}
  1. CustomListView您创建的内容添加到 xml 布局中,而不是ListView.

  2. 代替:

    ListView listView = findViewById(.......);
    

    经过:

    CustomListView listView = findViewById(.......);
    

CustomAdapter2)从你的类中删除这些方法:

@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();

}
});

如果您使用上述实现,那么当您单击警报对话框中的删除按钮时,该项目将不会收到下一次单击事件。


推荐阅读