onClickListener是影响到Android的ExapndabaleListView所有子项getChildView项目 [英] getChildView items onClickListener is effecting to all child items in ExapndabaleListView Android
问题描述
请看看这个画面:
当我点击接受变更为另一个按钮:
如果我点击在扩展列表视图有一个 getChildView
列表项,它也影响到其他子项,同时滚动屏幕。在这里,我改变按钮上的文字,当我点击 getChildview
项目
在这里,我点击接受一个孩子的按钮,那么它应该更改为另一个按钮,但滚动时所有子项中的按钮也改变
公共类ExpandableListAdapter扩展BaseExpandableListAdapter { 私人最终上下文的背景下; 私人最终名单<串GT;标题; 私人列表< DriverOrders>订购; GroupHolder持有人; 公共ExpandableListAdapter(最终FragmentActivity fragmentActivity,
最终名单<串GT; lidtDataHeaders,最终的名单,LT; DriverOrders>命令
){
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屋!