onClickListener是影响到Android的ExapndabaleListView所有子项getChildView项目 [英] getChildView items onClickListener is effecting to all child items in ExapndabaleListView Android

查看:231
本文介绍了onClickListener是影响到Android的ExapndabaleListView所有子项getChildView项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请看看这个画面:

请看接受按钮图像

当我点击接受变更为另一个按钮:

我点击接受chnaged到另一个按钮图像

如果我点击在扩展列表视图有一个 getChildView 列表项,它也影响到其他子项,同时滚动屏幕。在这里,我改变按钮上的文字,当我点击 getChildview 项目

在这里,我点击接受一个孩子的按钮,那么它应该更改为另一个按钮,但滚动时所有子项中的按钮也改变

 公共类ExpandableListAdapter扩展BaseExpandableListAdapter {        私人最终上下文的背景下;        私人最终名单<串GT;标题;        私人列表< D​​riverOrders>订购;        GroupHolder持有人;        公共ExpandableListAdapter(最终FragmentActivity fragmentActivity,
                                      最终名单<串GT; lidtDataHeaders,最终的名单,LT; D​​riverOrders>命令
        ){
            this.context = fragmentActivity;
            this.headings = lidtDataHeaders;
            this.order =订单;
        }        @覆盖
        公共对象getChild(最终诠释groupPosition,最终诠释childPosition){            返回this.headings.get(childPosition);
        }        @覆盖
        众长getChildId(最终诠释groupPosition,最终诠释childPosition){            返回childPosition;
        }        @覆盖
        公共查看getChildView(最终诠释groupPosition,
                                 最终诠释childPosition,最后布尔isLastChild,
                                 查看convertView,最终的ViewGroup父){            最后弦乐childName =(字符串)getChild(groupPosition,childPosition);            // GroupHolder持有人;
            支架=无效;            如果(convertView == NULL){
                最后LayoutInflater吹气=(LayoutInflater)this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.driver_child_layout,NULL);
                持有人=新GroupHolder();                holder.orderNumber =(TextView中)convertView.findViewById(R.id.orderNumber);
                holder.taskType =(TextView中)convertView.findViewById(R.id.taskType);
                holder.detaisl =(TextView中)convertView.findViewById(R.id.detaisl);
                holder.accept =(按钮)convertView.findViewById(R.id.accpet);
                holder.decline =(按钮)convertView.findViewById(R.id.decline);
                holder.started =(按钮)convertView.findViewById(R.id.started);
                convertView.setTag(保持器);            }其他{
                支架=(GroupHolder)convertView.getTag();
            }           / * TextView的订单号码=(TextView中)convertView.findViewById(R.id.orderNumber);
            TextView的任务类型=(TextView中)convertView.findViewById(R.id.taskType);
            TextView的detaisl =(TextView中)convertView.findViewById(R.id.detaisl);
            接受=(按钮)convertView.findViewById(R.id.button);
            跌幅=(按钮)convertView.findViewById(R.id.decline);            开始=(按钮)convertView.findViewById(R.id.started); * /            convertView.setOnClickListener(新View.OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    Log.e(,convertview点击里面的+ parent.getChildAt(childPosition));
                }
            });
            holder.started.setOnClickListener(新View.OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    如果(标志){
                        AsyncHttpClient客户端=新AsyncHttpClient();
                        client.get(NULL,CommonUtility.SERVER_URI +的人,开始/+的Long.parseLong(order.get(groupPosition).getOrderId()。修剪()),新JsonHtt presponseHandler(){
                            @覆盖
                            公共无效的onSuccess(INT状态code,头[]头,响应的JSONObject){
                                super.onSuccess(状态code,头,响应);                                尝试{
                                    如果(response.getString(STATUS)。equalsIgnoreCase(真)){                                        mListener.onStarttrip(order.get(groupPosition).getOrderId(),order.get(groupPosition).getCustomerName(),order.get(groupPosition).getCustomerContact());
                                    }
                                }赶上(JSONException E){
                                    e.printStackTrace();
                                }
                            }                            @覆盖
                            公共无效onFailure处(INT状态code,头[]头,抛出的Throwable,JSONObject的errorResponse){
                                super.onFailure(状态code,头,抛出,errorResponse);                                如果(状态code == 404){
                                    Toast.makeText(getActivity(),请求的资源未找到,Toast.LENGTH_LONG).show();
                                }
                                //当HTTP响应code是'500'
                                否则,如果(状态code == 500){
                                    Toast.makeText(getActivity(),出事了服务器端,Toast.LENGTH_LONG).show();
                                }
                                //当HTTP响应code比404其他,500
                                其他{
                                    Toast.makeText(getActivity(),意外的错误occcured [最常见的错误:设备可能没有连接互联网或远程服务器是跑不起来]!,Toast.LENGTH_LONG).show();
                                }
                            }                        });
                    }其他{
                        Toast.makeText(getActivity()开始之前,你必须接受订单,Toast.LENGTH_LONG).show();
                    }                }            });            holder.orderNumber.setText(order.get(groupPosition).getCustomerName());
            holder.taskType.setText(order.get(groupPosition).getCustomerContact());
            holder.detaisl.setText(order.get(groupPosition).getOrderId());            holder.accept.setOnClickListener(新View.OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    Log.e(,组positioins+ groupPosition);
                    。字符串associateId = sessionManager.getUserDetails()获得(associate_id);
                    串oredeerid = order.get(groupPosition).getOrderId();                    RequestParams PARAMS =新RequestParams();
                    params.put(OID,oredeerid);
                    params.put(做,associateId);
                    requestForAcceptOrder(参数,可以groupPosition);
                }            });
            holder.decline.setOnClickListener(新View.OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){                    holder.decline.setFocusable(假);
                    holder.decline.setEnabled(假);
                    holder.decline.setClickable(假);
                    sessionManager.setDclineId(order.get(groupPosition).getOrderId());
                    Toast.makeText(getActivity(),订单被拒绝,Toast.LENGTH_LONG).show();
                    意图myIntent =新意图(getActivity(),DeclineReceiver.class);
                    的PendingIntent的PendingIntent = PendingIntent.getBroadcast(getActivity(),0,myIntent,0);
                    龙timeInMillis =新的GregorianCalendar()getTimeInMillis()+ 1000。
                    Log.d(通,!!!!!!!);
                    AlarmManager alarmManager =(AlarmManager)getActivity()getSystemService(Context.ALARM_SERVICE)。
                    alarmManager.setRepeating(AlarmManager.RTC,timeInMillis,540万,的PendingIntent);
                    notifyDataSetChanged();                }
            });            返回convertView;
        }        @覆盖
        公众诠释getChildrenCount(最终诠释groupPosition){            返回1;
        }        @覆盖
        公共对象getGroup(最终诠释groupPosition){            返回this.headings.get(groupPosition);
        }        @覆盖
        公众诠释getGroupCount(){            返回this.headings.size();
        }        @覆盖
        众长getGroupId(最终诠释groupPosition){            返回groupPosition;
        }        @燮pressLint(NewApi)
        @覆盖
        公共查看getGroupView(最终诠释groupPosition,
                                 最终布尔isExpanded,查看convertView,
                                 最终的ViewGroup父){
            最后弦乐headerTitle =(字符串)this.getGroup(groupPosition);
           / *最后ExpandableListView mExpandableListView =(ExpandableListView)父母;
           mExpandableListView.expandGroup(0); * /            //显示展开视图指标从左至右
            如果(android.os.Build.VERSION.SDK_INT< android.os.Build.VERSION_ codeS.JELLY_BEAN_MR2){                CabOrderFragment.this.expnListView
                        .setIndicatorBounds(
                                CabOrderFragment.this.expnListView
                                        .getWidth() - 50,
                                CabOrderFragment.this.expnListView
                                        .getWidth());
            }其他{
                CabOrderFragment.this.expnListView
                        .setIndicatorBoundsRelative(
                                CabOrderFragment.this.expnListView
                                        .getWidth() - 50,
                                CabOrderFragment.this.expnListView
                                        .getWidth());            }
            最后LayoutInflater infalInflater =(LayoutInflater)this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(
                    R.layout.expandlistview_heading_group,NULL);
            //最后ImageView的图像=(ImageView的)convertView
            // .findViewById(R.id.ivHeadeImage);
            最终的TextView lblListHeader =(TextView中)convertView
                    .findViewById(R.id.tvListHeader);
            // image.setImageResource(this.images [groupPosition]);            lblListHeader.setTypeface(NULL,Typeface.BOLD);
            lblListHeader.setText(headerTitle.toUpperCase(Locale.getDefault()));
            lblListHeader.setTextSize(10);            返回convertView;
        }        @覆盖
        公共布尔hasStableIds(){
            // TODO自动生成方法存根
            返回false;
        }        @覆盖
        公共布尔isChildSelectable(最终诠释groupPosition,
                                         最终诠释childPosition){
            // TODO自动生成方法存根
            返回true;
        }
        私人无效requestForAcceptOrder(RequestParams参数,可以最终诠释groupPosition){
            AsyncHttpClient客户端=新AsyncHttpClient();
            client.get(NULL,CommonUtility.SERVER_URI +接受,则params,新JsonHtt presponseHandler(){
                @覆盖
                公共无效的onSuccess(INT状态code,头[]头,OBJ的JSONObject){
                    尝试{
                        如果(obj.getInt(code)== 0){                            holder.accept.setVisibility(View.GONE);
                            holder.decline.setVisibility(View.INVISIBLE);
                            holder.started.setVisibility(View.VISIBLE);
                            Toast.makeText(getActivity(),Oeder放置,Toast.LENGTH_LONG);
                            意图myIntent =新意图(getActivity(),DriverOrdersReceiver.class);
                            的PendingIntent的PendingIntent = PendingIntent.getBroadcast(getActivity(),0,myIntent,0);
                            Log.d(停机报警,!!!!!!!);
                            AlarmManager alarmManager =(AlarmManager)getActivity()getSystemService(Context.ALARM_SERVICE)。
                            alarmManager.cancel(的PendingIntent);
                            标志=真实的;                            Log.e(,对象数据+ obj.toString());                        }其他{                            Toast.makeText(getActivity(),Oeder没有放置,Toast.LENGTH_LONG);
                        }
                    }赶上(JSONException E){
                        e.printStackTrace();
                    }
                }
                @覆盖
                公共无效onFailure处(INT状态code,头[]头,抛出的Throwable,JSONObject的errorResponse){
                    super.onFailure(状态code,头,抛出,errorResponse);                    如果(状态code == 404){
                        Toast.makeText(getActivity(),请求的资源未找到,Toast.LENGTH_LONG).show();
                    }
                    //当HTTP响应code是'500'
                    否则,如果(状态code == 500){
                        Toast.makeText(getActivity(),出事了服务器端,Toast.LENGTH_LONG).show();
                    }
                    //当HTTP响应code比404其他,500
                    其他{
                        Toast.makeText(getActivity(),意外的错误occcured [最常见的错误:设备可能没有连接互联网或远程服务器是跑不起来]!,Toast.LENGTH_LONG).show();
                    }
                }
            });
        }        / *私有视图holder类* /
        私有类GroupHolder {
            TextView的订单号码;
            TextView的任务类型;
            TextView的detaisl;
            按钮接受;
            按钮下降;
            按钮启动;        }
    }


解决方案

从我所看到的问题是,你不使用你的onclick方法的观点,使您的用户界面所需要的变化。所以,问题是上下文这里。 Holder对象被创建和销毁每个组,你应该使用v从公共无效的onClick(视图V)作出总是UI的任何变化,无论是对儿童的意见组头点击。

PS。我建议有一个模型中的异步任务的变化数据并调用notifydatasetchanged()的适配器上返回的成功。

干杯

Please look into this screen:

And when I click on accept changed to another button:

if I click on one getChildView List item in expandable list-view,it is also effecting to other child item while scrolling the screen. Here I changed button text when I click the getChildview item

Here I am clicking on accept button of one child ,then it should change to another button but while scrolling all child items buttons also changing

public class ExpandableListAdapter extends BaseExpandableListAdapter {

        private final Context context;

        private final List<String> headings;

        private List<DriverOrders> order;

        GroupHolder holder;

        public ExpandableListAdapter(final FragmentActivity fragmentActivity,
                                      final List<String> lidtDataHeaders, final List<DriverOrders> orders
        ) {
            this.context = fragmentActivity;
            this.headings = lidtDataHeaders;
            this.order = orders;
        }

        @Override
        public Object getChild(final int groupPosition, final int childPosition) {

            return this.headings.get(childPosition);
        }

        @Override
        public long getChildId(final int groupPosition, final int childPosition) {

            return childPosition;
        }

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

            final String childName = (String) getChild(groupPosition, childPosition);



            // GroupHolder holder;
            holder = null;

            if (convertView == null) {
                final LayoutInflater inflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.driver_child_layout, null);
                holder = new GroupHolder();

                holder.orderNumber = (TextView) convertView.findViewById(R.id.orderNumber);
                holder.taskType = (TextView) convertView.findViewById(R.id.taskType);
                holder.detaisl = (TextView) convertView.findViewById(R.id.detaisl);
                holder.accept = (Button) convertView.findViewById(R.id.accpet);
                holder.decline = (Button) convertView.findViewById(R.id.decline);
                holder.started = (Button) convertView.findViewById(R.id.started);
                convertView.setTag(holder);

            } else {
                holder = (GroupHolder) convertView.getTag();
            }

           /* TextView orderNumber = (TextView) convertView.findViewById(R.id.orderNumber);
            TextView taskType = (TextView) convertView.findViewById(R.id.taskType);
            TextView detaisl = (TextView) convertView.findViewById(R.id.detaisl);
            accept = (Button) convertView.findViewById(R.id.button);
            decline = (Button) convertView.findViewById(R.id.decline);

            started = (Button) convertView.findViewById(R.id.started);*/

            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e("","inside convertview click"+parent.getChildAt(childPosition));
                }
            });


            holder.started.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (flag) {
                        AsyncHttpClient client = new AsyncHttpClient();
                        client.get(null, CommonUtility.SERVER_URI + "person-started/" + Long.parseLong(order.get(groupPosition).getOrderId().trim()), new JsonHttpResponseHandler() {
                            @Override
                            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                                super.onSuccess(statusCode, headers, response);

                                try {
                                    if (response.getString("STATUS").equalsIgnoreCase("true")) {

                                        mListener.onStarttrip(order.get(groupPosition).getOrderId(), order.get(groupPosition).getCustomerName(), order.get(groupPosition).getCustomerContact());
                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }

                            @Override
                            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                                super.onFailure(statusCode, headers, throwable, errorResponse);

                                if (statusCode == 404) {
                                    Toast.makeText(getActivity(), "Requested resource not found", Toast.LENGTH_LONG).show();
                                }
                                // When Http response code is '500'
                                else if (statusCode == 500) {
                                    Toast.makeText(getActivity(), "Something went wrong at server end", Toast.LENGTH_LONG).show();
                                }
                                // When Http response code other than 404, 500
                                else {
                                    Toast.makeText(getActivity(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]", Toast.LENGTH_LONG).show();
                                }
                            }

                        });


                    } else {
                        Toast.makeText(getActivity(), "Before started you have to accept the order", Toast.LENGTH_LONG).show();
                    }

                }

            });

            holder.orderNumber.setText(order.get(groupPosition).getCustomerName());
            holder.taskType.setText(order.get(groupPosition).getCustomerContact());
            holder.detaisl.setText(order.get(groupPosition).getOrderId());

            holder.accept.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    Log.e("", "group positioins" + groupPosition);
                    String associateId = sessionManager.getUserDetails().get("associate_id");
                    String oredeerid = order.get(groupPosition).getOrderId();

                    RequestParams params = new RequestParams();
                    params.put("oid", oredeerid);
                    params.put("did", associateId);
                    requestForAcceptOrder(params, groupPosition);


                }

            });
            holder.decline.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    holder.decline.setFocusable(false);
                    holder.decline.setEnabled(false);
                    holder.decline.setClickable(false);
                    sessionManager.setDclineId(order.get(groupPosition).getOrderId());
                    Toast.makeText(getActivity(), "Order is declined", Toast.LENGTH_LONG).show();
                    Intent myIntent = new Intent(getActivity(), DeclineReceiver.class);
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0);
                    Long timeInMillis = new GregorianCalendar().getTimeInMillis() + 1000;
                    Log.d("pass", "!!!!!!!");
                    AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
                    alarmManager.setRepeating(AlarmManager.RTC, timeInMillis, 5400000, pendingIntent);
                    notifyDataSetChanged();

                }
            });

            return convertView;
        }

        @Override
        public int getChildrenCount(final int groupPosition) {

            return 1;
        }

        @Override
        public Object getGroup(final int groupPosition) {

            return this.headings.get(groupPosition);
        }

        @Override
        public int getGroupCount() {

            return this.headings.size();
        }

        @Override
        public long getGroupId(final int groupPosition) {

            return groupPosition;
        }

        @SuppressLint("NewApi")
        @Override
        public View getGroupView(final int groupPosition,
                                 final boolean isExpanded, View convertView,
                                 final ViewGroup parent) {
            final String headerTitle = (String) this.getGroup(groupPosition);
           /* final ExpandableListView mExpandableListView = (ExpandableListView) parent;
           mExpandableListView.expandGroup(0);*/

            // to display indicator of Expandable view from left to right
            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {

                CabOrderFragment.this.expnListView
                        .setIndicatorBounds(
                                CabOrderFragment.this.expnListView
                                        .getWidth() - 50,
                                CabOrderFragment.this.expnListView
                                        .getWidth());
            } else {
                CabOrderFragment.this.expnListView
                        .setIndicatorBoundsRelative(
                                CabOrderFragment.this.expnListView
                                        .getWidth() - 50,
                                CabOrderFragment.this.expnListView
                                        .getWidth());

            }
            final LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(
                    R.layout.expandlistview_heading_group, null);
            // final ImageView image = (ImageView) convertView
            // .findViewById(R.id.ivHeadeImage);
            final TextView lblListHeader = (TextView) convertView
                    .findViewById(R.id.tvListHeader);
            // image.setImageResource(this.images[groupPosition]);

            lblListHeader.setTypeface(null, Typeface.BOLD);
            lblListHeader.setText(headerTitle.toUpperCase(Locale.getDefault()));
            lblListHeader.setTextSize(10);

            return convertView;
        }

        @Override
        public boolean hasStableIds() {
            // TODO Auto-generated method stub
            return false;
        }

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


        private void requestForAcceptOrder(RequestParams params, final int groupPosition) {
            AsyncHttpClient client = new AsyncHttpClient();
            client.get(null, CommonUtility.SERVER_URI + "accept", params, new JsonHttpResponseHandler() {


                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject obj) {
                    try {
                        if (obj.getInt("code") == 0) {

                            holder.accept.setVisibility(View.GONE);
                            holder.decline.setVisibility(View.INVISIBLE);
                            holder.started.setVisibility(View.VISIBLE);
                            Toast.makeText(getActivity(), "Oeder is  Placed", Toast.LENGTH_LONG);
                            Intent myIntent = new Intent(getActivity(), DriverOrdersReceiver.class);
                            PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0);
                            Log.d("stop alarm", "!!!!!!!");
                            AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
                            alarmManager.cancel(pendingIntent);
                            flag = true;

                            Log.e("", "object data" + obj.toString());

                        } else {

                            Toast.makeText(getActivity(), "Oeder is Not Placed", Toast.LENGTH_LONG);
                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }


                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                    super.onFailure(statusCode, headers, throwable, errorResponse);

                    if (statusCode == 404) {
                        Toast.makeText(getActivity(), "Requested resource not found", Toast.LENGTH_LONG).show();
                    }
                    // When Http response code is '500'
                    else if (statusCode == 500) {
                        Toast.makeText(getActivity(), "Something went wrong at server end", Toast.LENGTH_LONG).show();
                    }
                    // When Http response code other than 404, 500
                    else {
                        Toast.makeText(getActivity(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]", Toast.LENGTH_LONG).show();
                    }
                }


            });


        }

        /*private view holder class*/
        private class GroupHolder {
            TextView orderNumber;
            TextView taskType;
            TextView detaisl;
            Button accept;
            Button decline;
            Button started;

        }


    }

解决方案

From what I can see the problem is that you aren't using the view in your onclick method to make the changes required in your UI. So the problem is context here. Holder object is created and destroyed for each group and you should use v from public void onClick(View v) to make any changes to the UI always, be it for the click on the group header of child views.

PS. I would suggest to have the Async task change data in a Model and just call notifydatasetchanged() on the adapter on returning a success.

Cheers

这篇关于onClickListener是影响到Android的ExapndabaleListView所有子项getChildView项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆