2017-02-20 4 views
0

Ich habe eine Listenansicht in Android erstellt und ich möchte etwas wie jedes Mal tun, wenn ich auf ein Listenelement klicke, muss es zwischen rot und grün wechseln. Ich konnte das erreichen, aber das Problem ist, dass jedes Mal, wenn ich die Listenansicht nach oben oder unten scrolle, die Listenelemente immer wieder neu geladen werden und die getoggten Farben verloren gehen.ListView wird jedes Mal neu geladen, wenn ich scroll, was ich nicht will

Ich habe versucht, mit einem Toggle-Button, anstatt nur manuell die Farbe einzustellen, aber auch das verliert seinen Zustand. Wenn der Benutzer darauf klickt, wird der Status aktiviert und wenn der Benutzer nach oben oder unten scrollt, verliert er seinen Status und zeigt den Status "Aus" an.

Das ist mein MainActivity.java Datei

package bk.acs; 

import android.content.Context; 
import android.graphics.Color; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.Layout; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.Arrays; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ListView listView; 
     final String chars[] = new String[20]; 
     final int arr[]=new int[20]; 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     for(int i=0;i<20;i++) 
     { 
      chars[i]="15BEC058"+i; 
     } 
     Arrays.fill(arr,1); 
     listView=(ListView)findViewById(R.id.row); 
     MyAdapter adapter =new MyAdapter(this,chars); 
     listView.setAdapter(adapter); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 

      @Override 
      public void onItemClick(AdapterView adapterView, View view, int i, long l) { 
       arr[i]=(arr[i]==0)?(1):(0); 
      String res=(arr[i]==0)?("Absent"):("Present"); 
       if(arr[i]==0) 
       { 
        view.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          view.setBackgroundColor(getResources().getColor(R.color.item_red)); 
         } 
        }); 
       } 
       if(arr[i]==1) 
       { 
        view.setBackgroundColor(getResources().getColor(R.color.item_green)); 
       } 
       Toast.makeText(MainActivity.this, "Marked "+chars[i]+" as "+res, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

Und hier ist mein Adapter:

class MyAdapter extends ArrayAdapter 
{ 
    View row; 
    TextView tv; 
    String titles[]; 
    public MyAdapter(Context context , String[] titles) 
    { 
     super(context,R.layout.reg_li,R.id.reg_no,titles); 
     this.titles=titles; 
    } 
    @NonNull 
    @Override 
    public View getView(int position , View controlView , ViewGroup parent) 
    { 
     LayoutInflater inflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row=inflater.inflate(R.layout.reg_li,parent,false); 
     tv=(TextView)row.findViewById(R.id.reg_no); 
     tv.setText(titles[position]); 
     return row; 
    } 
} 
+0

Vielen Dank für die Angabe, dass Sie Ihren Code einfügen. Nun, wo ist es? –

+0

jetzt habe ich Code gehalten, bitte sehen Sie es ... –

+0

Frage klären und externen Code in Frage stellen. –

Antwort

0

, dies zu tun, müssen Sie eine boolean Variable deklarieren, die standardmäßig auf false gesetzt ist . Wenn Sie auf ein bestimmtes Element klicken, die Position des Elements abrufen und den Wert der booleschen Variablen auf "true" setzen, erhalten Sie das Ergebnis.

+0

Standardmäßig wurde es als falsch gesetzt, aber bitte schlage mich vor wie man es wahr –

+0

Wenn Sie die POJO-Klasse verwendet, um Ihre Daten/Werte zu speichern dann declareare neue boolesche Variable, wenn Sie die Daten in Ihre Pojo-Klasse speichern set boolean Variable false und immer wenn Sie das Element in Ihrer Listenansicht wählen Sie die Position von item und setze diese Position boolean true –

0

Verwenden Viewholder für Listview android Satz Farben auf dem Adapter-Klasse nur

public class MyAdapter extends BaseAdapter{ 
     String [] result; 
    Context context; 
     int [] imageId; 
    private static LayoutInflater inflater=null; 

public Myadapter(MainActivity mainActivity, String[] prgmNameList, int[] prgmImages) { 
    // TODO Auto-generated constructor stub 
    result=prgmNameList; 
    context=mainActivity; 
    imageId=prgmImages; 
    inflater = (LayoutInflater)context. 
getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

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

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

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

public class Holder 
    { 
TextView tv_language; 
    ImageView im_language; 
    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    Holder holder=new Holder(); 
     View view; 
     view = inflater.inflate(R.layout.layout_language_list_item, null); 

    holder.tv_language=(TextView) view.findViewById(R.id.tv_language); 
    holder.im_language=(ImageView) view.findViewById(R.id.image); 

     holder.tv_language.setText(result[position]); 
    Picasso.with(context).load(imageId[position]).into(holder.image); 

    view.setOnClickListener(new OnClickListener() { 
     @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
    //your color change if loop should come here 

} 
}); 
    return view; 
    } 

    } 

Der obige Adapter ist für eine Listenansicht eines Imageview enthält und eine textview.You benötigt eine Farbänderung Code in Onclick Hörer geben .i erwähnt den Ort im Kommentar. Siehe Android Custom Listview für die ordnungsgemäße Implementierung von Listview

+0

bro Ich schätze deine Idee, Hörer während der Laufzeit hinzuzufügen, sehr zu schätzen. Aber das hat auch nicht für mich funktioniert. Hier ist mein Code, bitte sieh dir das https: //bharath-koteswarao.github an. io/da1/code.html –

+0

Sie müssen einen Adapter mit einer Halter-Klasse verwenden, wie im obigen Code gezeigt. Und onlcik sollte Halter Ansicht gegeben werden. Sie geben immer noch einen Klick auf listitem in der Hauptaktivität selbst und nicht mit der Viewholder-Klasse. Lesen Sie das obige Tutorial, um mehr über Listenelemente mit Viewholder-Klasse zu erfahren – Ramees

Verwandte Themen