Jest kontynuacją tej question gdzie Reimar Twelker zasugerował użycie View.setFocusable()
i View.setClickable()
aby włączyć/wyłączyć wierszy w widoku listy używając ArrayAdapter.View.setFocusable() i View.setClickable() ma przeciwny efekt w zwyczaju ArrayAdapter
Próbowałem to zrobić, ale mam odwrotny skutek do tego, czego oczekiwałbym. Jeśli używam
View.setFocusable(true);
View.setClickable(true);
wiersz jest wyłączona (brak efektu po naciśnięciu go). A jeśli użyję czegoś odwrotnego:
View.setFocusable(false);
View.setClickable(false);
wiersz jest włączony (wybór zastosowany po naciśnięciu).
Jakąkolwiek wskazówkę dotyczącą tego, co może się wydarzyć?
Oto treść mojego układ:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_style"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:paddingLeft="5dip"
android:paddingRight="5dip">
<ImageView android:id="@+id/row_image_style"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="false"
android:scaleType="centerCrop"
android:drawingCacheQuality="low" />
</FrameLayout>
używam go w oknie alertu tak:
dialog = new AlertDialog.Builder(this)
.setTitle(R.string.templates_dialog)
.setAdapter(new StyleAdapter(this, R.id.row_style, StyleTemplate.values()),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setTemplate(StyleTemplate.values()[which]);
}
})
.create();
dialog.setCanceledOnTouchOutside(true);
i StyleAdapter
jest zdefiniowany następująco:
public class StyleAdapter extends ArrayAdapter<StyleTemplate>{
private final StyleTemplate[] m_objects;
private final LayoutInflater inflater;
public StyleAdapter(Context context, int textViewResourceId, StyleTemplate[] objects) {
super(context, textViewResourceId, objects);
m_objects = objects;
inflater = getLayoutInflater();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) { // Reuse the old view if it exists
row = inflater.inflate(R.layout.row_style, parent, false);
}
// Get the selected style data
StyleTemplate style = m_objects[position];
// Set the background image to the template background
ImageView bg = (ImageView) row.findViewById(R.id.row_image_style);
bg.setImageDrawable(null);
bg.setBackgroundColor(Color.rgb(style.bR, style.bG, style.bB));
boolean val = true;
row.setFocusable(val);
row.setClickable(val);
return row;
}
}
Aby przetestować efekt setFocusable()
i setClickable()
, po prostu zmienię wartość z val
w StyleAdapter.getView()
.
Najgorsze jest to, że nawet jeśli je wyłączysz, tylko blednie, ale nadal działa i przechwytuje zdarzenia. – Gangnus
Naprawdę jestem tym zainteresowany, ponieważ próbuję wyłączyć selektor na liście listItem. Czy wywołanie setClickable (true) (w przeciwieństwie do setClickable (false)) na tym elemencie jest jedyną opcją lub czy istnieją inne sposoby? – doplumi
@domenicop Możesz również spróbować przesłonić isEnabled (pozycja int) dla ArrayAdapter i zwracać wartość false dla wyłączonych elementów. Nie pamiętam, dlaczego nie chciałem iść tą drogą, ale to może ci pomóc. – Pooks