Несколько событий щелчка по элементу группы expandablelistview

У меня есть два вопроса о событиях кликов expandablelistview в groupView (не дочернем)

  1. Когда у меня есть ребенок в моем GroupView, я могу получить groupPosition, используя приведенный ниже фрагмент

    expandableListView.setOnGroupClickListener (новый ExpandableListView.OnGroupClickListener() {

        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            Log.d("Clicked on item: ", ""+groupPosition);
            return false;
        }
    });
    

но когда у меня нет дочерних элементов, К сожалению, «MyApp» останавливается при щелчке мыши. В этом случае, как получить groupPosition?

  1. У меня есть две кнопки в макете groupView моего расширяемого списка. теперь мне нужно зарегистрировать два разных события щелчка для обеих кнопок. У этого groupView также не было дочернего элемента. Я тщательно искал в SO, но я понятия не имел об этом.

        <LinearLayout
            android:layout_below="@id/qtd_prc_cont"
            android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center">
            <Textview
                android:layout_width="wrap_content" android:layout_height="wrap_content"  android:id="@+id/group_text" android:text="Group 1" />
            <Button
                android:id="@+id/btn_reject"
                android:layout_width="90dp" android:layout_height="30dp" android:text="Reject" android:textAllCaps="false" android:background="@drawable/reject_button_styles"
                android:layout_marginRight="60dp" android:textColor="#a1a2a1" android:textSize="13dp"/>
            <Button
                android:id="@+id/btn_accept"
                android:layout_width="90dp" android:layout_height="30dp" android:text="Accept" android:textAllCaps="false" android:background="@drawable/button_radius"
                android:textColor="@color/colorWhite" android:textSize="13dp"/>
        </LinearLayout>
    

Вот мой класс адаптера:

public class OfferedTrucksAdapter extends BaseExpandableListAdapter {
private Context context;
private ArrayList<QuotedListGroup> groups;

public OfferedTrucksAdapter(Context context, ArrayList<QuotedListGroup> groups) {
    this.context = context;
    this.groups = groups;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    ArrayList<QuotedListItem> chList = groups.get(groupPosition).getItems();
    return chList.get(childPosition);
}

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

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

    QuotedListItem child = (QuotedListItem) getChild(groupPosition, childPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) context
                .getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.activity_quoted_list_item, null);
    }
    TextView container_label = (TextView) convertView.findViewById(R.id.container);
    container_label.setText(child.getContainer());

    TextView truck_number = (TextView) convertView.findViewById(R.id.truck_number);
    truck_number.setText(child.getTruckNumber().toString());

    TextView truck_weight = (TextView) convertView.findViewById(R.id.truck_weight);
    truck_weight.setText(child.getTruckWeight().toString());

    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    ArrayList<QuotedListItem> chList = groups.get(groupPosition).getItems();
    return chList.size();
}

@Override
public Object getGroup(int groupPosition) {
    return groups.get(groupPosition);
}

@Override
public int getGroupCount() {
    return groups.size();
}

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    QuotedListGroup group = (QuotedListGroup) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater inf = (LayoutInflater) context
                .getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = inf.inflate(R.layout.activity_offered_trucks_group, null);
    }

    if(groupPosition%2 == 0) {
        convertView.findViewById(R.id.offered_trucks_group).setVisibility(View.VISIBLE);
        convertView.findViewById(R.id.offered_price_group).setVisibility(View.GONE);

        TextView destination = (TextView) convertView.findViewById(R.id.offered_destination);
        destination.setText(group.getDestination());

        TextView trucks = (TextView) convertView.findViewById(R.id.offered_trucks);
        trucks.setText(group.getTrucks() + "");

        TextView date_label = (TextView) convertView.findViewById(R.id.offered_date_label);
        date_label.setText(group.getDateLabel().toString());

        TextView material = (TextView) convertView.findViewById(R.id.offered_material);
        material.setText(group.getMaterial().toString());

        TruckaroIconView see_hide_icon = (TruckaroIconView) convertView.findViewById(R.id.offered_see_hide_icon);
        TextView see_hide_label = (TextView) convertView.findViewById(R.id.offered_see_hide_label);
        if(isExpanded) {
            see_hide_label.setText("Hide Trucks");
            see_hide_icon.setRotation(180);
        } else {
            see_hide_label.setText("See Trucks");
            see_hide_icon.setRotation(0);
        }
    } else {
        convertView.findViewById(R.id.offered_trucks_group).setVisibility(View.GONE);
        convertView.findViewById(R.id.offered_price_group).setVisibility(View.VISIBLE);

        TextView offeredPrice = (TextView) convertView.findViewById(R.id.offered_price);
        offeredPrice.setText(group.getOfferedPrice());

        TextView quotedPrice = (TextView) convertView.findViewById(R.id.quoted_price);
        quotedPrice.setText(group.getQuotedPrice());

    }
    return convertView;
}

protected static class RowViewHolder {
    public Button buttonReject, buttonAccept;
}

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

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

}

На основе нажатия кнопки «принять/отклонить» мне нужно передать данные Textview следующему действию через намерение.

Вот как выглядит мой расширяемый список: введите здесь описание изображения

На изображении выше есть четыре элемента списка. У 1-го и 3-го есть дети, а у 2-го и 4-го детей нет. Когда я нажимаю кнопку принятия 2-го элемента, мне нужно передать данные 1-го элемента следующему действию. Я не могу установить события нажатия на эти кнопки.

Пожалуйста, помогите мне выбраться из этого.

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


person Mr.7    schedule 06.05.2016    source источник
comment
Какую ошибку вы получили при сбое приложения?   -  person AL.    schedule 06.05.2016
comment
@McAwesomville Я не получаю никаких ошибок. Это просто возврат к предыдущей деятельности. и он отлично работает, когда я добавляю ребенка в ту же группу. Не может ли элемент группы расширяемого списка быть пустым (без дочернего элемента)?   -  person Mr.7    schedule 06.05.2016
comment
Что было К сожалению, «MyApp» остановилось?   -  person AL.    schedule 06.05.2016
comment
Извини. Это немного сбивает с толку. Насколько я понимаю, у вас возникли проблемы с получением значения groupPosition, когда у конкретного groupView нет childView?   -  person AL.    schedule 06.05.2016
comment
@McAwesomville Без каких-либо ошибок, он просто оставляет сообщение К сожалению, MyAPp остановлен (к сведению, «MyApp» — это имя моего приложения)   -  person Mr.7    schedule 06.05.2016
comment
Точно @McAwesomville   -  person Mr.7    schedule 06.05.2016
comment
Я с трудом представляю, как проходит ваш процесс, можете ли вы опубликовать несколько скриншотов? Это очень помогло бы.   -  person AL.    schedule 06.05.2016
comment
@McAwesomville Я обновил фотографии, можно один раз проверить?   -  person Mr.7    schedule 06.05.2016
comment
Так что проверить. На приведенном вами скриншоте. Есть четыре GroupView элемента. 1-я и 3-я имеют Child предметов (я думаю, это See Trucks?). А товары Наша цена — это те, о которых вы говорите, что у них нет Child. Если это так, я думаю, вам нужно изменить это в своем классе Adapter. Установите onClickListener() этих кнопок. Меня здесь смущает то, что зачем передавать значение из верхнего элемента GroupView?   -  person AL.    schedule 06.05.2016
comment
@McAwesomville я попробовал onClickListener(), используя идентификатор кнопки. Но когда я нажимаю кнопку принятия 2-го элемента, он возвращает кнопку 4-го элемента (т.е. кнопку последнего элемента). Я думаю, что идентификаторы кнопок имеют приоритет. Это случается?   -  person Mr.7    schedule 06.05.2016
comment
@McAwesomville К вашему сведению, вы правильно поняли мой вопрос.   -  person Mr.7    schedule 06.05.2016
comment
Хм. Кажется, что он получает неправильный идентификатор, возможно, получает неправильное значение. Попробуйте добавить журналы, посмотрите значение, которое вы получаете для идентификатора. Я взгляну на это больше, когда я вернусь. Ваше здоровье! :D   -  person AL.    schedule 06.05.2016
comment
Можете ли вы опубликовать свой класс адаптера?   -  person AL.    schedule 09.05.2016
comment
@McAwesomville Я разместил свой класс адаптера, пожалуйста, проверьте его один раз. Спасибо.   -  person Mr.7    schedule 09.05.2016


Ответы (1)


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

Вот что я получил:

@Override
    public View getGroupView(final int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        QuotedListGroup group = (QuotedListGroup) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater inf = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = inf.inflate(R.layout.activity_offered_trucks_group, null);
        }

        if (groupPosition % 2 == 0) {

            // Removed some code here.

        } else {
            convertView.findViewById(R.id.offered_trucks_group).setVisibility(View.GONE);
            convertView.findViewById(R.id.offered_price_group).setVisibility(View.VISIBLE);

            TextView offeredPrice = (TextView) convertView.findViewById(R.id.offered_price);
            offeredPrice.setText(group.getOfferedPrice());

            TextView quotedPrice = (TextView) convertView.findViewById(R.id.quoted_price);
            quotedPrice.setText(group.getQuotedPrice());

            // Added code here ----

            // Initialize the buttons.
            Button btnAccept = (Button) convertView.findViewById( < insert_btn_id_here >);
            Button btnReject = (Button) convertView.findViewById( < insert_btn_id_here >);

            // Set onClickListeners for the buttons.
            btnAccept.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    /*
                    Modify with the object you have, then pass the group position - 1
                    (double check this, you just need to pass the position of the upper item).
                    */
                    Object groupObject = getGroup(groupPosition - 1);

                    /*
                    Get the value from the groupObject that you want to include in the intent.
                    NOTE: I'm just using some sample codes, modify it to what you need.
                    */
                    String sampleStr = groupObject.destination.getText().toString();

                    /*
                    Intent stuff, I think you know this already.
                     */

                    Intent intent = new Intent(context, SampleActivity.class);
                    intent.putExtra("SAMPLE_KEY", sampleStr);
                    context.startActivity(intent);

                }
            });

            btnReject.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // your code for reject button here.
                }
            });

            // Until here ----

        }

        return convertView;
    }

Я просто добавил слушателей для ваших кнопок (принять, отклонить) внутри оператора else. Вам нужно изменить его на то, что вам нужно, так как я не вижу остальной части вашего кода. Дайте мне знать, если у вас есть вопросы. Ваше здоровье! :D

person AL.    schedule 09.05.2016
comment
PS: Посмотрите на мои комментарии внутри фрагмента кода. ;) - person AL.; 09.05.2016
comment
Большое спасибо за помощь, и у меня есть сомнения. теперь я получаю groupObject, но как я могу получить свойство назначения? Используя нотацию .(dot), я получаю эту ошибку: не удается найти назначение переменной символа - person Mr.7; 09.05.2016
comment
Как я это вижу. У вас уже есть статический класс RowViewHolder. Вы можете использовать его. Увидев свой адаптер, я думаю, вы можете оптимизировать его больше. Этот сообщение выглядит хорошо. После того, как вам удастся использовать объект ViewHolder, вы можете вызвать его, как обычно: ViewHolder vh = getGroup(groupPosition - 1);, затем vh.destination.getText().toString();. Что-то подобное. Удачи друг. Ваше здоровье! :D - person AL.; 09.05.2016