2013-12-16 5 views
0

Когда я нажимаю элемент, он не запускает мой код onListItemClick, и я понятия не имею, почему!onListClickItem не отвечает ни на что

У меня есть фрагмент, расширяющий listFragment с помощью этого кода. Это в onCreateView()

{ 
adapter = new CustomArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_multiple_choice, names); 
     setListAdapter(adapter); 
} 


@Override 
public void onListItemClick(ListView l, View v, int position, long id){ 

    CheckedTextView check = (CheckedTextView) v; 

    if (check.isChecked()){ 
     selections.remove((Integer) position); 
    } 
    else{ 
     selections.add((Integer) position); 
    } 

    //DOESNT RUN THIS 

} 

Это мой пользовательский адаптер

package project.android.bellringing; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckedTextView; 

public class CustomArrayAdapter<T> extends ArrayAdapter<String> { 

private ArrayList<Boolean> bitset = new ArrayList<Boolean>(); 
private ArrayList<String> names; 

public CustomArrayAdapter(Context context, int textViewResourceId){ 
    super(context, textViewResourceId); 
} 


public CustomArrayAdapter(Activity a, int textViewResourceId, ArrayList<String> entries) {  
    super(a, textViewResourceId, entries); 

    for (int i = 0; i < entries.size(); i++){ 
     bitset.add(i, false); 
    } 

    names = new ArrayList<String>(entries); 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    CheckedTextView c; 

    if (convertView == null) { 

     LayoutInflater vi = LayoutInflater.from(getContext()); 
     c = (CheckedTextView) vi.inflate(android.R.layout.simple_list_item_multiple_choice, null); 

    } 
    else{ 
     c = (CheckedTextView) convertView; 
    } 

    final CheckedTextView ctv = c; 
    ctv.setText(names.get(position)); 

    if (bitset.get(position) == false) 
     ctv.setChecked(false); 
    else 
     ctv.setChecked(true); 

    ctv.setOnClickListener(new View.OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      ctv.setChecked(!ctv.isChecked()); 

      if (bitset.get(position) == false) 
       bitset.set(position, true); 
      else 
       bitset.set(position, false); 
     } 

    }); 


    return ctv; 
} 

}

+0

Был ли мой образец полезен или вам нужна другая информация? –

ответ

0

Got что-то, Ваше CheckedTextView крадет вход осязание, поэтому определить его как Not focusable в вашем xml

+0

Вы можете видеть все это там. Так что нет –

0

Проблема заключается в фокусируемости CheckedTextView в ListView. Вы можете исправить это значение android:focusable="false" в своем макете для CheckedTextView.

Это вызывает то, что будет называться OnItemClick, но OnClickListener на вашем CheckedTextView не вызывается, и вы должны обрабатывать проверенные и непроверенные состояния самостоятельно. Меня это интересовало, поэтому я сделал образец. Объяснение этого было бы, вероятно, дольше и сложнее, чем код, так вот оно:

Основная часть обработки CheckedTextView состояния в onItemClick, а также обработка состояния в конце getView и состояние проводятся в BooleanSparseArray, который обновляется от onItemClick.

public class TestListActivity extends ListActivity 
{ 
    private TestAdapter mTestAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.list_activity); 
     final List<String> names = Arrays.asList(new String[]{"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"}); 

     mTestAdapter = new TestAdapter(this, names); 

     setListAdapter(mTestAdapter); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) 
    { 
     CheckedTextView checkedTextView = (CheckedTextView) v; 

     boolean toggleChecked = !checkedTextView.isChecked(); //toggle checked state 
     checkedTextView.setChecked(toggleChecked); 
     checkedTextView.setCheckMarkDrawable(toggleChecked ? android.R.drawable.checkbox_on_background : 0); //setting correct check mark 

     //setting the flag to properly refresh when scrolling 
     mTestAdapter.setChecked(position, toggleChecked); 
    } 

    private static class TestAdapter extends ArrayAdapter<String> 
    { 
     private SparseBooleanArray bitset = new SparseBooleanArray(); 

     private TestAdapter(Context context, List<String> objects) 
     { 
      super(context, 0, objects); 
     } 

     public void setChecked(int position, boolean checked) 
     { 
      bitset.append(position, checked); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      CheckedTextView checkedTextView; 
      if (convertView == null) 
      { 
       checkedTextView= (CheckedTextView) LayoutInflater.from(getContext()).inflate(R.layout.checked, null); 
      } 
      else 
      { 
       checkedTextView = (CheckedTextView) convertView; 
      } 

      boolean isChecked = bitset.get(position); 
      checkedTextView.setChecked(isChecked); //setting checked to correct state 
      checkedTextView.setCheckMarkDrawable(isChecked ? android.R.drawable.checkbox_on_background : 0); // setting correct check mark 
      checkedTextView.setText(getItem(position)); 

      return checkedTextView; 
     } 
    } 
} 
Смежные вопросы