Pergunta

Eu criei um ListView personalizado, estendendo o SimpleCurSorAdapter. O resultado é Image + CheckEdTextView (Texto + Caixa de seleção).

Depois que tive problemas com as caixas de seleção erradas sendo verificadas (Veja aqui) Eu tive que remover lv.SetcheTemode (ListView.choice_mode_multiple); de OnCreate.

Agora clico em uma linha ListItem e ele verifica a caixa de seleção certa.

O que estou tentando fazer é fazer um linearlayout.

Aqui está o código:

lv.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);

if (!markedItem.isChecked()) {
 markedItem.setChecked(true);

 //show bottom control panel
 findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);


} else {
 markedItem.setChecked(false);

 SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();

 //if no checkbox is checked, hide bottom control panel
 if (lala == null) {
  findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
 }
}
view.refreshDrawableState();
//showSortBtn(markedItem);

} });

É assim que vinculo o ListView ao adaptador personalizado:

projection = new String[] { Browser.BookmarkColumns._ID,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.URL };
        displayFields = new String[] { Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.URL };
        int[] displayViews = new int[] { android.R.id.icon, android.R.id.text1 };

        cur = managedQuery(BOOKMARKS_URI, projection,
                Browser.BookmarkColumns.BOOKMARK + " == 1", null, Browser.BookmarkColumns.VISITS + " DESC");

        setListAdapter(new ImageCursorAdapter(this,
                android.R.layout.simple_list_item_single_choice, cur,
                displayFields, displayViews));

Eu tenho dois problemas com isso:

  1. Se eu verificar 2 ou mais caixas de seleção e desmarcar apenas uma, o linearlayout desaparece, o que significa SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions(); é nulo. Por que é nulo se ainda há outras caixas de seleção verificadas?

  2. Se eu mudar findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE); para findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE); (Como eu quero fazer) A primeira caixa de seleção está sendo verificada corretamente e depois que o linearlayout se foi, tudo está uma bagunça de novo, como em Minha pergunta anterior.

Aprecie qualquer ajuda!

Foi útil?

Solução

Por que você espera que getCheckedItemPositions () retorne NULL se não houver itens verificados? Parece que seu modo de escolha está errado

A SparseBooleanArray which will return true for each call to get(int position) where position is a position in the list, or null if the choice mode is set to CHOICE_MODE_NONE.

A matriz deve ser nula apenas se for Choice_mode_none.

Por que não tentar algo assim?

if (((ListView) parent).getCheckedItemPositions().size() > 0){

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);
else{

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE;
}

Atualizar

Tenho certeza de que tem a ver com esta linha

 View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.image_list, null);
        }

Você obtém a visão e depois reatribua a visão para o inflador. Eu estou meio que perdido exatamente por que isso daria o comportamento que você está se esforçando. Você também pode querer experimentar o bindView() Método, embora eu não tenha certeza do porquê. Talvez, em vez de usar o layout padrão do Android (aquele que você está dando ao setadapter, faça seu próprio layout. Ele está claramente confuso sobre qual a visão é atribuída a qual layout.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top