在Android中使用自定义适配器禁用和更改单个listview项目的样式

在Android中使用自定义适配器禁用和更改单个listview项目的样式,android,listview,custom-adapter,Android,Listview,Custom Adapter,我有一个listview,它由数据库中的信息填充,使用自定义适配器来处理各个视图。我试图做的是禁用该列表视图中的某些项目(这是一个基本的进度系统,即用户完成模块1,然后模块2解锁) 在我的adapter类中,我看到这里和那里提到重写areAllItemsEnabled()和isEnabled()方法。我遇到的问题是,areAllItemsEnabled()似乎还可以,但是isEnabled()方法基本上启用/禁用整个listview,而不是单个项。感谢您的帮助,提前谢谢 适配器类: public

我有一个listview,它由数据库中的信息填充,使用自定义适配器来处理各个视图。我试图做的是禁用该列表视图中的某些项目(这是一个基本的进度系统,即用户完成模块1,然后模块2解锁)

在我的adapter类中,我看到这里和那里提到重写areAllItemsEnabled()isEnabled()方法。我遇到的问题是,areAllItemsEnabled()似乎还可以,但是isEnabled()方法基本上启用/禁用整个listview,而不是单个项。感谢您的帮助,提前谢谢

适配器类:

public class ModuleAdapter extends ArrayAdapter<Module> {

Context context;
int layoutResourceId;
Module data[];

public ModuleAdapter(Context context, int layoutResourceId,
        Module data[]) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ModuleHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new ModuleHolder();
        holder.modJapTitle = (TextView)row.findViewById(R.id.moduleJapTitle);
        holder.modEngTitle = (TextView)row.findViewById(R.id.moduleEngTitle);
        holder.modComp = (TextView)row.findViewById(R.id.moduleCompletion);
        holder.modRating = (RatingBar)row.findViewById(R.id.moduleScore);

        row.setTag(holder);
    }
    else
    {
        holder = (ModuleHolder)row.getTag();
    }

    Module module = data[position];
    holder.modJapTitle.setText(module.moduleJapaneseTitle);
    holder.modEngTitle.setText(module.moduleEnglishTitle);
    holder.modComp.setText(module.moduleCompletionRate);
    holder.modRating.setRating(module.moduleRating);

    return row;
}

static class ModuleHolder
{
    TextView modEngTitle;
    TextView modJapTitle;
    TextView modComp;
    RatingBar modRating;
}


@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return false;
}
公共类ModuleDapter扩展了ArrayAdapter{
语境;
国际布局资源;
模块数据[];
公共模块适配器(上下文上下文,内部布局资源ID,
模块数据[]){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
ModuleHolder holder=null;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新模块holder();
holder.modJapTitle=(TextView)row.findViewById(R.id.moduleAcceptile);
holder.modEngTitle=(TextView)row.findViewById(R.id.moduleEngTitle);
holder.modComp=(TextView)row.findViewById(R.id.moduleCompletion);
holder.modRating=(RatingBar)行findViewById(R.id.moduleScore);
row.setTag(支架);
}
其他的
{
holder=(ModuleHolder)row.getTag();
}
模块=数据[位置];
holder.modJapTitle.setText(module.moduleJapaneseTitle);
holder.modEngTitle.setText(module.moduleEnglishTitle);
holder.modComp.setText(模块模块完成率);
支架.模块额定值.设置额定值(模块化);
返回行;
}
静态类ModuleHolder
{
文本视图模式标题;
文本视图标题;
TextView modComp;
评级杆;
}
@凌驾
公共布尔值areAllItemsEnabled(){
返回false;
}
@凌驾
公共布尔值isEnabled(整型位置){
返回false;
}
}

活动中的执行:

ModuleAdapter moduleData = new ModuleAdapter(this, R.layout.module_box_item, module_data);
    moduleData.areAllItemsEnabled();
    moduleData.isEnabled(0);
    ListView listView1 = (ListView)findViewById(R.id.moduleListContainer);
    listView1.setClickable(true);
    listView1.setAdapter(moduleData);
    listView1.setCacheColorHint(Color.TRANSPARENT);
    listView1.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            int temp = position + 1;
            Intent i = new Intent(Story.this, SkitSelect.class);
            i.putExtra("moduleToGet", temp);
            startActivity(i);
        }
    });
moduledapter moduleData=new moduledapter(这个,R.layout.module\u框项目,module\u数据);
moduleData.areAllItemsEnabled();
moduleData.isEnabled(0);
ListView listView1=(ListView)findViewById(R.id.moduleListContainer);
listView1.setClickable(真);
listView1.setAdapter(moduleData);
listView1.setCacheColorHint(Color.TRANSPARENT);
listView1.setOnItemClickListener(新的android.widget.AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
内部温度=位置+1;
意图i=新意图(Story.this,SkitSelect.class);
i、 putExtra(“moduleToGet”,温度);
星触觉(i);
}
});
单个项目的视图说明:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/moduleBox"
android:id="@+id/moduleBoxSingle"
android:focusableInTouchMode="false"
android:clickable="false"
android:focusable="false" >

<TextView
    android:id="@+id/moduleJapTitle"
    style="@style/moduleTitleJap" />
<TextView
    android:id="@+id/moduleCompletion"
    android:layout_above="@+id/moduleSepartor"
    style="@style/moduleCompletion" />
<View
    android:id="@+id/moduleSepartor"
    android:layout_below="@+id/moduleJapTitle"
    style="@style/moduleSeperator" />
<TextView
    android:id="@+id/moduleEngTitle"
    android:layout_below="@+id/moduleSepartor"
    style="@style/moduleTitleEng" />
<RatingBar
    android:id="@+id/moduleScore"
    android:layout_below="@+id/moduleSepartor"
    style="@style/moduleRating"
    android:layout_alignParentRight="true" />

</RelativeLayout>

它将给出当前行的状态

    public boolean isEnabled(int position) {
    return super.isEnabled(position);
};
但是你想做什么呢?您是否通过此选项启用/禁用

(adapter.getView(position, convertView, parent)).setEnabled(false);

好吧,我知道了。方法很简单,如下所示:

public boolean isEnabled(int position) {

    if (position == 2) {
        return false
    }

    return true;  
}
这必须在自定义适配器中设置。未从活动中的实现调用。这就是问题所在,因为我试图执行类似mycustomadapter.isEnabled(2)的操作,这是不正确的


希望这对其他人有帮助。

你好。谢谢你的回复。这就是我要做的。。。假设我从数据库中获取了一些信息,返回了4行,这4行的信息将创建4个列表项。我想做的是手动禁用/启用这些项目。即,从数据库返回的项目#1是用户的模块1,一旦完成模块1,模块2将解锁。等等您的代码看起来很有前途,但我不知道如何实现它?
public boolean isEnabled(int position) {

    if (position == 2) {
        return false
    }

    return true;  
}