2015-11-28 4 views
9

Ich habe drei Schaltflächen in einigen der Listenelemente in der Listenansicht und beim Klicken auf diese Schaltfläche möchte ich das Layout des Listenelements ändern, aber das Problem, vor dem ich stehe, ist unten aufgeführt .Button in der Listenansicht erstellt Problem beim Scrollen und auf Knopf klicken

1). Auf Knopfdruck ändert sich ein anderes Listen-Layout. 2). Auf dem Bildlauf der Listenansicht wird ein anderes Layout der Listenelemente geändert, auf das ich nicht geklickt habe.

Hier ist der Code der Adapterklasse.

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; 


} 



} 

Bitte helfen Sie mir, ich in dieser schlecht sehr stecke,

+0

add 'convertView = null;' vor 'if (convertView == null)' –

+0

verwenden Sie listview oder recyclerView – Lokesh

+0

versuchen Sie dies http://StackOverflow.com/A/26975256/1765530, Versuchen Sie mit SetTag & getTag für Schaltfläche zu Holen Sie sich die exakte Position – appukrb

Antwort

-1

Sie klicken Zuhörer innerhalb else Fall nicht Handhabung:

else if (convertView==null) 

schreiben alle OnClicklistener ‚s außen (oben return convertView).

0

ich Ihren Adapter Code Sie verwenden nur, wenn die Bedingung ist, Listview nicht so klug, so, wenn Sie sonst Teil verwenden nur schreiben wenn nicht dann und führen Sie eine Veranstaltung dann Listview kann auch nächste Position Ansicht ändern, verwenden gesehen Sichtbarkeit oder alles, was in Ihrem wenn ein Teil ist, also bitte alle anderen Teil, wenn in Ihrem Adapter Code

ich schlage vor, dass die Verwendung RecyclerView fortgeschritteneren dann Listview schreiben.

1

Schritt 1: Legen Sie das auf Klick Zuhörer nach dieser Zeile (viewHolder = (ViewHolder) convertView.getTag())

Schritt 2: In Onclick Verfahren entfernen Ansicht Kreationen/Logiken löschen. Ändern Sie den Modellwert ("In Ihrem Fall aktuellen Artikel Flag") und rufen notifyDataset geänderte Methode

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

Schritt 3: die Ansicht ändern, basierend auf Ihren Modellwert ("Flag-Wert")

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); 
} 

Hinweis: Die Listenansicht bindet nur die Daten und ändert nie das Viewholder-View-Objekt für jeden Datenwert. Wir müssen die Views Visibility/Background basierend auf dem Datenwert ändern. Wenn Sie "wenn Bedingung" verwenden, muss "else" da sein.

0

Kurze Antwort:

Setzen Sie Ihre onClick Zuhörer außerhalb des wenn auch Block:

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() { .... }); 

, warum das Problem Happen

Was Sie tun, ist ViewHolderPattern genannt. Es wird hauptsächlich verwendet, um die Leistung der Scroll-Listenansicht zu erhöhen, indem unnötige findViewById s vermieden wird, was ein schwerer Prozess ist.

Mal sehen, wie es funktioniert:

Bitte beachten Sie dieses Bild, die eine normale Liste zeigen: enter image description here

Unsere Adapter viele Zeilen haben aber nur drei von ihnen füllt die Ansicht. Wenn Sie Ihren Adapter machen, sind nur die ersten 3 Zeilen null und sollten aufgeblasen werden. Andere Ansichten verwenden dieselbe Ansicht, die zuvor erstellt wurde.

@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 { 

    } 
} 

Der Hinweis ist: Sie sollten nichts einstellen, wenn sonst blockieren. Sie sollten nur Ihre Ansichten in ihnen finden und sie Ihrem viewHolder zuweisen und verwandte Dinge (wie Rand, Padding, Textsize, ...) sehen. Sie sollten keine Ressourcen ausführen oder auf Listener bezogene Dinge in diesem Block klicken (wie setText, setBitmap, Onclicklistener, ...)

WARUM?! Wir haben das vorher beantwortet! weil es nur für die ersten Elemente aufgerufen wird, die die Ansicht füllen!

Verwandte Themen