2015-11-28 11 views
9

मेरे पास सूची दृश्य में कुछ सूची आइटमों में तीन बटन हैं और उस बटन के क्लिक पर मैं उस सूची आइटम का लेआउट बदलना चाहता हूं लेकिन समस्या का सामना करना पड़ रहा है नीचे सूचीबद्ध है ।सूची दृश्य के अंदर बटन स्क्रॉलिंग पर और समस्या पर क्लिक कर रहा है

1)। बटन के क्लिक पर एक और सूची-आइटम लेआउट बदल जाता है। 2)। सूची के स्क्रॉल पर- एक और सूची देखें- आइटम लेआउट बदल जाता है जिसे मैंने क्लिक नहीं किया है।

यहां एडाप्टर क्लास का कोड है।

import java.util.ArrayList; 

import com.xsinfosol.DOT.R; 
import com.xsinfosol.DOT.ImageLoading.ImageLoader; 
import com.xsinfosol.DOT.LibraryClasses.RippleView; 
import com.xsinfosol.DOT.model.DOT_Common_Model; 

import android.content.Context; 

import android.graphics.drawable.Drawable; 
import android.support.v7.internal.widget.ButtonBarLayout; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.view.WindowManager.LayoutParams; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class Agenda_Adapter extends BaseAdapter { 

    Context context; 
    ArrayList<DOT_Common_Model> arrayList; 
    ViewHolder viewHolder; 

    public Agenda_Adapter(Context context , ArrayList<DOT_Common_Model> arrayList) { 
     // TODO Auto-generated constructor stub 


     this.context = context; 
     this.arrayList = arrayList; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return arrayList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return arrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 



     if(convertView==null) 
     { 
      viewHolder = new ViewHolder(); 



      convertView = LayoutInflater.from 
        (context).inflate(R.layout.agenda_event_list_item, null); 
      viewHolder.linearLayout = (LinearLayout)convertView.findViewById(R.id.agenda_button_layout); 
      viewHolder.linearLayout.setVisibility(View.GONE); 
      viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.agenda_event_checkbox); 
      viewHolder.eventName = (TextView)convertView.findViewById(R.id.agenda_event_name); 
      viewHolder.imageView = (ImageView)convertView.findViewById(R.id.agenda_event_imae); 
      viewHolder.place = (TextView)convertView.findViewById(R.id.agenda_event_place); 
      viewHolder.time = (TextView)convertView.findViewById(R.id.agenda_event_date_time); 
      viewHolder.going = (RippleView)convertView.findViewById(R.id.agenda_rippleview_going); 
      viewHolder.notGoing = (RippleView)convertView.findViewById(R.id.agenda_rippleview_not_going); 
      viewHolder.mayBe = (RippleView)convertView.findViewById(R.id.agenda_rippleview_maybe); 
      viewHolder.going.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        viewHolder.going.setVisibility(View.GONE); 
        viewHolder.notGoing.setVisibility(View.GONE); 
        viewHolder.mayBe.setVisibility(View.GONE); 


        Drawable tick = context.getResources().getDrawable(R.drawable.ic_action_tick); 
        tick.setBounds(0,0, 30, 30); 
        Button going = new Button(context); 

        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); 
        params.setMargins(10,0, 10, 4); 
        going.setLayoutParams(params); 
        going.setBackgroundColor(context.getResources().getColor(android.R.color.holo_green_dark)); 
        going.setText("Going"); 
        going.setTextSize(15); 
        going.setTextColor(R.color.white); 
        going.setCompoundDrawables(null, null, tick, null); 
        going.setCompoundDrawablePadding(5); 
        going.setGravity(Gravity.CENTER); 
        if(viewHolder.linearLayout!=null) 
         viewHolder.linearLayout.removeAllViews(); 
        viewHolder.linearLayout.addView(going); 
       } 
      }); 


      viewHolder.notGoing.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        viewHolder.going.setVisibility(View.GONE); 
        viewHolder.notGoing.setVisibility(View.GONE); 
        viewHolder.mayBe.setVisibility(View.GONE); 


        Drawable cross = context.getResources().getDrawable(R.drawable.ic_action_cancel); 
        cross.setBounds(0,0, 30, 30); 
        Button button = new Button(context); 

        LinearLayout.LayoutParams paramsCross = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); 
        paramsCross.setMargins(10,0, 10, 4); 
        button.setLayoutParams(paramsCross); 
        button.setBackgroundColor(context.getResources().getColor(R.color.red)); 
        button.setText("Not Going"); 
        button.setTextSize(15); 
        button.setTextColor(R.color.white); 
        button.setCompoundDrawables(null, null, cross, null); 
        button.setCompoundDrawablePadding(5); 
        button.setGravity(Gravity.CENTER); 
        if(viewHolder.linearLayout!=null) 
          viewHolder.linearLayout.removeAllViews(); 
        viewHolder.linearLayout.addView(button); 
       } 
      }); 


      viewHolder.mayBe.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        viewHolder.going.setVisibility(View.GONE); 
        viewHolder.notGoing.setVisibility(View.GONE); 
        viewHolder.mayBe.setVisibility(View.GONE); 


        Drawable mayBe = context.getResources().getDrawable(R.drawable.ic_action_emo_err); 
        mayBe.setBounds(0,0, 30, 30); 
        Button maybe = new Button(context); 

        LinearLayout.LayoutParams paramsMaybe = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); 
        paramsMaybe.setMargins(10,0, 10, 4); 
        maybe.setLayoutParams(paramsMaybe); 
        maybe.setBackgroundColor(context.getResources().getColor(R.color.yellow)); 
        maybe.setText("May Be"); 
        maybe.setTextSize(15); 
        maybe.setTextColor(R.color.white); 
        maybe.setCompoundDrawables(null, null, mayBe, null); 
        maybe.setCompoundDrawablePadding(5); 
        maybe.setGravity(Gravity.CENTER); 
        if(viewHolder.linearLayout!=null) 
          viewHolder.linearLayout.removeAllViews(); 
        viewHolder.linearLayout.addView(maybe); 

       } 
      }); 


      viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        // TODO Auto-generated method stub 


        int getPosition = (Integer)buttonView.getTag(); 

        arrayList.get(getPosition).setChecked(buttonView.isChecked()); 



       } 
      }); 

      convertView.setTag(viewHolder); 
      convertView.setTag(R.id.agenda_event_checkbox, viewHolder.checkBox); 
      convertView.setTag(R.id.agenda_event_imae, viewHolder.imageView); 
      convertView.setTag(R.id.agenda_event_name, viewHolder.eventName); 
      convertView.setTag(R.id.agenda_event_place, viewHolder.place); 
      convertView.setTag(R.id.agenda_event_date_time, viewHolder.time); 
      convertView.setTag(R.id.agenda_button_layout, viewHolder.linearLayout); 
      convertView.setTag(R.id.agenda_rippleview_going, viewHolder.going); 
      convertView.setTag(R.id.agenda_rippleview_not_going, viewHolder.notGoing); 
      convertView.setTag(R.id.agenda_rippleview_maybe, viewHolder.mayBe); 






     }else 
      viewHolder = (ViewHolder)convertView.getTag(); 



     viewHolder.checkBox.setTag(position); 
     viewHolder.going.setTag(position); 
     viewHolder.notGoing.setTag(position); 
     viewHolder.mayBe.setTag(position); 

     ImageLoader imageLoader = new ImageLoader(context); 
     ImageView imageView = viewHolder.imageView; 
     imageLoader.DisplayImage(arrayList.get(position).getImage(), imageView); 


     viewHolder.checkBox.setChecked(arrayList.get(position).ischecked()); 

     switch (arrayList.get(position).getFlag()) { 
     case "0": 
      // hasn's seleted any option 
      if(viewHolder.linearLayout.getVisibility()==View.GONE) 
        viewHolder.linearLayout.setVisibility(View.VISIBLE); 

      if(viewHolder.going.getVisibility()==View.GONE) 
        viewHolder.going.setVisibility(View.VISIBLE); 

      if(viewHolder.mayBe.getVisibility()==View.GONE) 
       viewHolder.mayBe.setVisibility(View.VISIBLE); 

      if(viewHolder.notGoing.getVisibility()==View.GONE) 
       viewHolder.notGoing.setVisibility(View.VISIBLE); 



      break; 

     case "1": 
      // selected going 

      viewHolder.going.setVisibility(View.GONE); 
      viewHolder.notGoing.setVisibility(View.GONE); 
      viewHolder.mayBe.setVisibility(View.GONE); 


      Drawable tick = context.getResources().getDrawable(R.drawable.ic_action_tick); 
      tick.setBounds(0,0, 30, 30); 
      Button going = new Button(context); 

      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); 
      params.setMargins(10,0, 10, 4); 
      going.setLayoutParams(params); 
      going.setBackgroundColor(context.getResources().getColor(android.R.color.holo_green_dark)); 
      going.setText("Going"); 
      going.setTextSize(15); 
      going.setTextColor(context.getResources().getColor(R.color.white)); 
      going.setCompoundDrawables(null, null, tick, null); 
      going.setCompoundDrawablePadding(5); 
      going.setGravity(Gravity.CENTER); 
      if(viewHolder.linearLayout!=null) 
       viewHolder.linearLayout.removeAllViews(); 
      viewHolder.linearLayout.addView(going); 







      break; 
     case "2": 
      // select not going 


      viewHolder.going.setVisibility(View.GONE); 
      viewHolder.notGoing.setVisibility(View.GONE); 
      viewHolder.mayBe.setVisibility(View.GONE); 


      Drawable cross = context.getResources().getDrawable(R.drawable.ic_action_cancel); 
      cross.setBounds(0,0, 30, 30); 
      Button button = new Button(context); 

      LinearLayout.LayoutParams paramsCross = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); 
      paramsCross.setMargins(10,0, 10, 4); 
      button.setLayoutParams(paramsCross); 
      button.setBackgroundColor(context.getResources().getColor(R.color.red)); 
      button.setText("Not Going"); 
      button.setTextSize(15); 
      button.setTextColor(context.getResources().getColor(R.color.white)); 
      button.setCompoundDrawables(null, null, cross, null); 
      button.setCompoundDrawablePadding(5); 
      button.setGravity(Gravity.CENTER); 
      if(viewHolder.linearLayout!=null) 
        viewHolder.linearLayout.removeAllViews(); 
      viewHolder.linearLayout.addView(button); 







      break; 

     case "3": 

      // selected may be 

      viewHolder.going.setVisibility(View.GONE); 
      viewHolder.notGoing.setVisibility(View.GONE); 
      viewHolder.mayBe.setVisibility(View.GONE); 


      Drawable mayBe = context.getResources().getDrawable(R.drawable.ic_action_emo_err); 
      mayBe.setBounds(0,0, 30, 30); 
      Button maybe = new Button(context); 

      LinearLayout.LayoutParams paramsMaybe = new LinearLayout.LayoutParams(new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 40)); 
      paramsMaybe.setMargins(10,0, 10, 4); 
      maybe.setLayoutParams(paramsMaybe); 
      maybe.setBackgroundColor(context.getResources().getColor(R.color.yellow)); 
      maybe.setText("May Be"); 
      maybe.setTextSize(15); 
      maybe.setTextColor(context.getResources().getColor(R.color.black_overlay)); 
      maybe.setCompoundDrawables(null, null, mayBe, null); 
      maybe.setCompoundDrawablePadding(5); 
      maybe.setGravity(Gravity.CENTER); 
      if(viewHolder.linearLayout!=null) 
        viewHolder.linearLayout.removeAllViews(); 
      viewHolder.linearLayout.addView(maybe); 






      break; 

     case "4": 
      // event doesn't have any invitatin option 

      if(viewHolder.linearLayout.getVisibility()==View.VISIBLE) 
        viewHolder.linearLayout.setVisibility(View.GONE); 



      break; 
     } 




     viewHolder.eventName.setText(arrayList.get(position).getName()); 
     viewHolder.place.setText(arrayList.get(position).getPlace()); 
     viewHolder.time.setText(arrayList.get(position).getTime()); 


























     return convertView; 
    } 

static class ViewHolder 
{ 
    TextView eventName , place, time; 
    CheckBox checkBox; 
    ImageView imageView; 
    LinearLayout linearLayout; 
    RippleView going , notGoing , mayBe; 


} 



} 

कृपया मेरी मदद करो मैं इस में बहुत बुरी तरह से फंस कर रहा हूँ,

+0

ऐड 'convertView = बातिल;' अगर (convertView == नल) ' –

+0

आप सूचीदृश्य या recyclerView – Lokesh

+0

उपयोग कर रहे हैं इससे पहले कि' इस http://stackoverflow.com/a/26975256/1765530 कोशिश, करने के लिए बटन के लिए setTag और getTag उपयोग करने का प्रयास सटीक स्थिति – appukrb

उत्तर

-1

आप else मामले के अंदर क्लिक श्रोता से निपटने नहीं कर रहे हैं: (return convertView ऊपर)

else if (convertView==null) 

लिखें सभी OnClicklistener के बाहर।

0

मैं तुम्हें केवल उपयोग कर रहे हैं शर्त, सूचीदृश्य इतना समझदार नहीं होती उपयोग करती हैं इसलिए जब भी आप केवल यदि का उपयोग बाकी हिस्सा तो लिख सकते हैं और एक घटना तो ListView भी अगले स्थिति देखें बदल सकते हैं प्रदर्शन नहीं अपने एडाप्टर कोड देखा, दृश्यता या कुछ भी अपने यदि हिस्से में है कि, तो अपने अनुकूलक कोड

में हर किसी और यदि का हिस्सा लिखें मुझे लगता है कि उपयोग RecyclerView अधिक उन्नत तो ListView सुझाव देते हैं।

1

चरण 1: इस लाइन के बाद यह क्लिक श्रोताओं पर प्लेस (viewHolder = (ViewHolder) convertView.getTag())

चरण 2: onclick विधि में दृश्य कृतियों को दूर/लॉजिक्स को हटा दें। notifyDataset मॉडल मूल्य ("अपने मामले वर्तमान आइटम ध्वज में") को बदलें और फोन बदली हुई विधि

@Override 
public void onClick(View view) { 
    //Set the flag based on your view click 
    ((DOT_Common_Model) getItem(int position)).setFlag(0); 
    notifyDatasetChanged(); 
} 

चरण 3: अपने मॉडल मूल्य ("झंडा मूल्य")

if(((DOT_Common_Model) getItem(int position)).getFlag()==0){ 
    view1.setVisibility(View.VISIBLE); 
    view2.setVisibility(View.GONE); 
    view3.setVisibility(View.GONE); 
}else if(((DOT_Common_Model) getItem(int position)).getFlag()==1){ 
    view1.setVisibility(View.GONE); 
    view2.setVisibility(View.VISIBLE); 
    view3.setVisibility(View.GONE); 
}else if(((DOT_Common_Model) getItem(int position)).getFlag()==2){ 
    view1.setVisibility(View.GONE); 
    view2.setVisibility(View.GONE); 
    view3.setVisibility(View.VISIBLE); 
}else{ 
    view1.setVisibility(View.VISIBLE); 
    view2.setVisibility(View.VISIBLE); 
    view3.setVisibility(View.VISIBLE); 
} 
के आधार पर दृश्य बदलें

नोट: सूची दृश्य केवल डेटा को बांधता है और यह प्रत्येक डेटा मान के लिए व्यूल्डर व्यू ऑब्जेक्ट को कभी भी नहीं बदलता है, हमें डेटा मान के आधार पर दृश्य दृश्यता/पृष्ठभूमि को बदलने की आवश्यकता है। यदि आप "" स्थिति "का उपयोग करते हैं तो" अन्य "वहां होना चाहिए।

0

लघु उत्तर:

यदि किसी और ब्लॉक के बाहर आपका onClick श्रोता रखो:

if(convertView==null) { 
    //BLABLABLA 
} else { 

} 

// WRITE YOUR CLICK LISTENER HERE 
viewHolder.mayBe.setOnClickListener(new OnClickListener() { ..... }); 
viewHolder.notGoing.setOnClickListener(new OnClickListener() { .. }); 
viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { .... }); 

समस्या क्यों हो

क्या आप कर रहे हैं ViewHolderPattern कहा जाता है। इसका उपयोग मुख्य रूप से अनावश्यक खोजने से स्क्रॉलिंग सूची दृश्य के प्रदर्शन को बढ़ाने के लिए किया जाता है findViewById एस जो एक भारी प्रक्रिया है।

कृपया इस तस्वीर जो एक सामान्य सूची दिखाने के लिए देखें:: enter image description here

हमारे अनुकूलक कई पंक्तियों है, लेकिन उनमें से केवल 3 दृश्य भरता

देखें कि यह कैसे काम करता है की सुविधा देता है। जब आप अपना एडाप्टर बनाते हैं, तो केवल पहली 3 पंक्तियां शून्य होती हैं और इसे फुलाया जाना चाहिए। अन्य विचार उसी दृश्य का उपयोग करेंगे जो पहले बनाया गया था।

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // in our example, the convert view is only null for the first 3 items 
    if(convertView==null) { 

    } else { 

    } 
} 

नोट यह है: यदि आपको ब्लॉक में कुछ भी सेट नहीं करना चाहिए। आपको बस उनके विचारों को ढूंढना चाहिए और उन्हें अपने विचार में असाइन करना चाहिए और संबंधित चीजों को देखें (जैसे मार्जिन, पैडिंग, टेक्स्टिक्स, ...)। आपको संसाधन नहीं करना चाहिए या उस ब्लॉक में श्रोता संबंधित चीजों पर क्लिक करना चाहिए (जैसे सेटटेक्स्ट, सेटबिटमैप, ऑनक्लिकलिस्टर, ...)

क्यों? हमने पहले जवाब दिया था! क्योंकि यह केवल उन वस्तुओं को बुलाया जाता है जो दृश्य भरते हैं!

संबंधित मुद्दे