Отключение и изменение стиля отдельных элементов списка с помощью специального адаптера в Android

У меня есть список, который заполняется информацией из базы данных с использованием специального адаптера для обработки отдельных представлений. Что я пытаюсь сделать, так это отключить определенные элементы в этом списке (это базовая система прогрессии, т.е. пользователь заканчивает модуль 1, а затем разблокируется модуль 2).

Я видел здесь и там упоминания о переопределении методов areAllItemsEnabled() и isEnabled() в моем классе адаптера. Проблема, с которой я столкнулся, заключается в том, что areAllItemsEnabled() выглядит нормально, но метод isEnabled() в основном включает/отключает весь список, а не отдельный элемент. Любая помощь приветствуется, заранее спасибо.

Класс адаптера:

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;
}

}

Внедрение в деятельность:

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);
        }
    });

Описание вида для отдельных элементов:

<?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>

person mwrazam    schedule 15.07.2012    source источник


Ответы (2)


Хорошо, я понял это. Метод был таким простым:

public boolean isEnabled(int position) {

    if (position == 2) {
        return false
    }

    return true;  
}

Это должно быть установлено в пользовательском адаптере. Не вызывается из реализации в действии. Это была проблема, так как я пытался сделать что-то вроде mycustomadapter.isEnabled(2), что неверно.

Надеюсь, это поможет кому-то еще.

person mwrazam    schedule 20.07.2012

but the isEnabled() method basically enables/disables the entire listview, not the individual item.

Это даст статус текущей строки.

    public boolean isEnabled(int position) {
    return super.isEnabled(position);
};

но что ты пытаешься сделать? вы включаете/отключаете этим

(adapter.getView(position, convertView, parent)).setEnabled(false);
person Mohsin Naeem    schedule 15.07.2012
comment
Привет. Спасибо за ваш ответ. Вот что я пытаюсь сделать... Итак, допустим, я получаю некоторую информацию из базы данных, и возвращаются 4 строки, информация из этих 4 строк создаст 4 элемента списка. Что я хочу сделать, так это отключить/включить эти элементы вручную. т.е. элемент № 1, возвращаемый из базы данных, является модулем 1 для пользователя, и после завершения модуля 1 модуль 2 разблокируется. И так далее. Ваш код выглядит многообещающе, но я не знаю, как его реализовать? - person mwrazam; 16.07.2012