ExpandableListView onChildClickListener - PullRequest
       6

ExpandableListView onChildClickListener

3 голосов
/ 06 января 2012

Я новая пчела на Android.

Я работаю с ExpandableListViewAdapter и сталкиваюсь с проблемой.

OnChildClickListener не работает, когда я нажимаю на текстовое поле редактирования.

У меня вопрос, будет ли он работать в текстовом поле редактирования или нет.

Я реализую BaseExpandableListAdapter.

Заранее спасибо.

public class TryExpandableListViewActivity extends Activity implements     OnChildClickListener {

LinearLayout llayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    llayout = (LinearLayout) findViewById(R.id.llayout);

    ExpandableListView list = new ExpandableListView(this);
    list.setGroupIndicator(null);
    list.setChildIndicator(null);
    String[] titles = {"A","B","C"};
    String[] fruits = {"a1","a2"};
    String[] veggies = {"b1","b2","b3"};
    String[] meats = {"c1","c2"};
    String[][] contents = {fruits,veggies,meats};
    SimplerExpandableListAdapter adapter = new SimplerExpandableListAdapter(this,titles, contents);

    list.setAdapter(adapter);

    llayout.addView(list);

    list.setOnChildClickListener(this);
}

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
    Log.i("Test","-------------------------------------------");
    return false;
}

}

class SimplerExpandableListAdapter extends BaseExpandableListAdapter {

private Context mContext;
private String[][] mContents;
private String[] mTitles;

public SimplerExpandableListAdapter(Context context, String[] titles, String[][] contents) {
    super();
    if(titles.length != contents.length) {
      throw new IllegalArgumentException("Titles and Contents must be the same size.");
    }
    mContext = context;
    mContents = contents;
    mTitles = titles;

  }

@Override
public Object getChild(int groupPosition, int childPosition) {
    return mContents[groupPosition][childPosition];
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return 0;
}

@Override
public View getChildView(int groupPosition, int childPosition,
    boolean isLastChild, View convertView, ViewGroup parent) { 

        EditText row = (EditText)convertView;
        if(row == null) {
          row = new EditText(mContext);
        }
        row.setTypeface(Typeface.DEFAULT_BOLD);
        row.setText(mContents[groupPosition][childPosition]);
        return row;

}

@Override
public int getChildrenCount(int groupPosition) {
    return mContents[groupPosition].length;
}

@Override
public Object getGroup(int groupPosition) {
    return mContents[groupPosition];
}

@Override
public int getGroupCount() {
    return mContents.length;
}

@Override
public long getGroupId(int groupPosition) {
    return 0;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
    View convertView, ViewGroup parent) {
    TextView row = (TextView)convertView;
    if(row == null) {
      row = new TextView(mContext);
    }
    row.setTypeface(Typeface.DEFAULT_BOLD);
    row.setText(mTitles[groupPosition]);
    return row;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}

}

Ответы [ 5 ]

3 голосов
/ 30 июля 2012

то, что здесь происходит, - ваш текст редактирования фокусируется на вас. Таким образом, onChildClick не запускается. Попробуйте сделать свойство фокуса editText равным false с помощью кода. Если вы сделаете это в XML-файле, он все равно не будет работать. Надеемся, что он работает для вас.

3 голосов
/ 11 декабря 2012

У меня такая же проблема (OnChildClickListener не обрабатывает событие click). Чтобы обрабатывать щелчки дочерних элементов, убедитесь, что ваш ExpandableListAdapter возвращает значение «истина» (по умолчанию оно «исчезает») в isChildSelectable:

public class MyExpandableListAdapter extends BaseExpandableListAdapter  {

...

@Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        **return true;**
    }

}
3 голосов
/ 06 января 2012

Не видя код, это всего лишь предположение, но childCLickListener может потреблять событие, поэтому оно не достигает редактируемого текста, попробуйте вернуть false в childClickListener

Edit

Хорошо, я только что создал небольшой проект с вашим кодом, и я не смог запустить onCildClickListener, изменив его на TextView, и он отлично работает.Это как-то связано с EditText (возможно, он потребляет событие или регистрируется не как щелчок, а как изменение фокуса, но я просто догадываюсь на данный момент).

Так что в ответ на ваш вопрос, возможно ли это - я так не думаю.Но я сделал небольшой обходной путь, который может пригодиться.

Прикрепите onTouchListener() к EditText и проверьте наличие MotionEvent.ACTION_DOWN

1 голос
/ 06 мая 2013

Я столкнулся с той же проблемой ... N, ссылаясь на приведенные выше ответы, которые я кодировал ... вот что я нашел ...

  • Убедитесь, что SimplerExpandableListAdapters расширяет BaseExpandableListAdapter и реализует OnChildClickListener.
  • Добавить onchildclick как customExpandableList.setOnChildClickListener (новый MyCustomAdapter (MainActivity.this,)). * «аргумент» - это то, что вы получаете в классе SimplerExpandableListAdapter. * «MyCustomAdapter» должен быть заменен на ваш ExpandableListAdapter (SimplerExpandableListAdapter в вашем случае)

Я просто добавляю фрагмент кода для справки ...

    public class MyCustomAdapter extends BaseExpandableListAdapter implements OnChildClickListener {
      private LayoutInflater inflater;
      private ArrayList<Parent> mParent;

И добавьте щелчок мышкой в ​​класс адаптера. Как показано

    public class MyCustomAdapter extends BaseExpandableListAdapter implements OnChildClickListener {
      private LayoutInflater inflater;
      private ArrayList<Parent> mParent;
      public MyCustomAdapter(Context context, ArrayList<Parent> parent) {
        mParent = parent;
        inflater = LayoutInflater.from(context);
      }

      @Override
      public boolean onChildClick(ExpandableListView arg0, View arg1, int arg2, int arg3, long arg4) {
        // TODO Auto-generated method stub
        Log.d("trial", "ExpandableList= "+arg0+" ,View= "+arg1+" ,arg2= "+arg2+", arg3= "+arg3+", arg4= "+arg4);
        return true;
      }
    }

Добавьте вызов onChildclickListener в действии, где закодирован Expandableview. (Класс MainActivity в моем примере).

    mExpandableList.setOnChildClickListener(new MyCustomAdapter(MainActivity.this, arrayParents));
0 голосов
/ 15 марта 2013

Поздний ответ, но, возможно, это поможет другим.У меня была та же проблема, и установить ExpandableListView на onItemClickListener () или onItemLongClickListener () делает это:

    mExpandListView
            .setOnItemLongClickListener(new OnItemLongClickListener() {

                @Override
                public boolean onItemLongClick(AdapterView<?> adapterView,
                        View view, int position, long id) {
                    // TODO Auto-generated method stub
                    //do Your Code here

                    return true;
                }

            });
...