Мультитач в ListView, содержащий EditText и CheckBox для каждого элемента строки (Android)

У меня есть ListView, где каждый элемент строки имеет элементы EditText и CheckBox. Образец изображения вы можете увидеть ниже.

введите здесь описание изображенияЯ собираюсь сделать следующее

Я хочу реализовать как OnItemClickListener (для ListView), так и OnClickListener (для EditText и CheckBox), т.е. я хочу, чтобы задача A выполнялась при нажатии элементов ListView (вне EditText и CheckBox), и я также хочу выполнять отдельные задачи при нажатии EditText и CheckBox соответственно.

Моя проблема

Если в ListView, EditText или CheckBox не задан атрибут для управления фокусом, то поведение по умолчанию заключается в том, что элементы строки ListView не будут прослушивать щелчок элемента, но EditText и CheckBox получают фокус.

Играя с этими атрибутами и их значениями (например, - )

// to ListView
android:descendantFocusability="blocksDescendants" 
// to EditText and CheckBox
android:focusable="false"
android:focusableInTouchMode="true"   

Слушатели работают либо для ListView, либо для EditText. Прослушиватель кликов CheckBox работает во всех случаях (странно). Я новичок в этом, и любая помощь будет оценена по достоинству. Я не могу опубликовать источник прямо сейчас, поэтому, пожалуйста, потерпите меня. Любое решение, предложение или объяснение будет большим подспорьем.




Ответы (1)


Я рад, что мне удалось решить эту проблему. Что я хотел сделать, так это (позвольте мне еще раз очистить это), я хотел, чтобы EditText можно было сфокусировать, и, кроме того, я должен был иметь возможность щелкать каждую строку ListView для выполнения определенной задачи. Ну, нам не понадобятся эти атрибуты:

android:focusable=""  
android:focusableInTouchMode=""  
android:descendantFocusability=""  

Что просто нужно сделать, так это
В вашем пользовательском классе ListAdapter реализуйте OnClickListener для каждого элемента (скажем, EditText, CheckBox и т. д.), а также реализуйте OnClickListener для rootView (т. е. для элемента строки ListView).
Например:

public class CustomListAdapter extends ArrayAdapter<YOUR_OBJECT> {

    Context context;

    ArrayList<YOUR_OBJECT> itemlist = new ArrayList<YOUR_OBJECT>();

    Integer resourceID;

    ViewHolder holder;

    public ServicesListAdapter(Context context, int resourceId, ArrayList<YOUR_OBJECT> itemlist) {
        super(context, resourceId, itemlist);
        this.itemlist.addAll(itemlist);
        this.context = context;
        this.resourceID = resourceId;
    }

    public class ViewHolder {
        TextView name;
        EditText editText;
        CheckBox checkBox;
    }

    public View getView(final int position, View rootView, ViewGroup parent) {

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  

        if (rootView == null) {

            rootView = mInflater.inflate(resourceID, null);

            holder = new ViewHolder();

            holder.name = (TextView) rootView.findViewById(R.id.name);
            holder.editText = (EditText) rootView.findViewById(R.id.port);
            holder.checkBox = (CheckBox) rootView.findViewById(R.id.check_box);

            // Add Listeners for EditText and CheckBox here

            rootView.setTag(holder);

        } else {
            holder = (ViewHolder) rootView.getTag();
        }

        // Click Listener for the ListView row item
        rootView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "Clicked" + position, Toast.LENGTH_SHORT).show();
            }
        });  

        // Do what rest you need to do with your ViewHolder

    }
}
person yuva    schedule 12.08.2014