ChechBox im ListView abfragen

  • 6 Antworten
  • Neuester Beitrag
Diskutiere ChechBox im ListView abfragen im Android App Entwicklung im Bereich Betriebssysteme & Apps.
C

ChrisFand

Neues Mitglied
Hallo an alle, ich hab folgendes Problem:
Habe eine MainActivity in welcher eine ListView liegt, diese bekommt ihre list Items von der mitarbeiter_list row.xml.
In der besagten mitarbeiter_list_row.xml ist eine Checkbox. Jetzt würde ich gerne den Status der Checkboxen und mir Ihren Text ausgeben lassen abfangen, das habe ich in der Main versucht aber das geht einfach nicht.Sobald der Code drin ist um den CheckedChange abzufragen geht die app nicht mehr. Ich hoffe Ihr mir evtl mal ein bisschen auf die Sprünge helfen, Verzweifelung pur!

MainActivity.java
Code:
public class MainActivity extends Activity {
	
	ListView listView;
	File mitarbeiterCSV;
	ArrayList<String> mitarbeiterList;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_main);
		
		File dir = Environment.getExternalStorageDirectory();	
		mitarbeiterCSV=new File(dir, "download/Mitarbeiter.csv");
		mitarbeiterList=new ArrayList<String>();
		loadStart();
						
		listView=(ListView) findViewById(R.id.listView);		
		ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.list_mitarbeiter_row, R.id.checkbox,mitarbeiterList);
		listView.setAdapter(adapter);
		CheckBox cb=(CheckBox) findViewById(R.id.checkbox);
        cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
 
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    Toast.makeText(getApplicationContext(), "Checked", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(getApplicationContext(), "Not Checked", Toast.LENGTH_SHORT).show();
                }
            }
        });
	}	
	      
	public void loadStart(){
		FileInputStream fileIn;
		try
		{
			fileIn=new FileInputStream(mitarbeiterCSV);
			loadData(fileIn);
		}
		catch (FileNotFoundException e)
		{
			Toast.makeText(getApplicationContext(),"Mitarbeiter Stammdaten nicht vorhanden", Toast.LENGTH_LONG).show();
		}
	}
	
	public void loadData(FileInputStream fileIn) {
		BufferedReader reader=new BufferedReader(new InputStreamReader(fileIn));
		String line;
		try
		{
			while((line=reader.readLine()) != null){
				mitarbeiterList.add(line);
			}
		}
		catch (IOException e)
		{
			Toast.makeText(getApplicationContext(),"Fehler beim laden der Daten.", Toast.LENGTH_LONG).show();
		}
	}
	
	//**Click Event Button "Weiter"**/
	public void next(View view) {
		Intent nextScreen=new Intent(getApplicationContext(), ProjektActivity.class);
		startActivity(nextScreen);		 
	}
}
activity_main.xml
HTML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="fill_vertical"
    android:orientation="vertical"
    tools:context="${packageName}.${activityClass}" >

    <LinearLayout
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" >

        <Button
            android:id="@+id/Mitarbeiter"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/Mitarbeiter" />

        <Button
            android:id="@+id/btWeiter"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_weight="1"
            android:onClick="next"
            android:text="@string/Weiter" />
    </LinearLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="448dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true" >

    </ListView>
</LinearLayout>
mitarbeiter_list_row.xml
HTML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:gravity="left">

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:text="" />
</LinearLayout>
 
C

cocojack42

Ambitioniertes Mitglied
Ich bin nicht sicher ob das was du dort gepostet hast funktionieren kann.

Ich würde mir einen eigenen Array-Adapter schreiben.
Diesem übergibst du dann ein Callback, welches er beim "createView" dem jeweiligen View übergibt.

in dieser Funktion übergibst du dann dem jeweiligen "onChangedListener" dein Callback.

hier ein ähnliches Beispiel:
ListView with checkboxes
 
C

ChrisFand

Neues Mitglied
Also es läuft soweit das ich die Daten aus der csv Datei anzeigen kann und die CheckBoxen "Checken" kann. Ich werde das mal so aufbauen wie es in deinem Link steht. Danke
 
C

cocojack42

Ambitioniertes Mitglied
Hier mal ein kleines Beispiel (aus dem Kopf heraus):

Code:
public CheckboxListActivity extends Activity implements CheckboxListAdapter[COLOR=#000000][B].[/B][/COLOR]CheckboxCallback{
//[...

@Override
protected void onCreate(....){
     listView = (ListView) findViewById(...);
     listView.setAdapter(new CheckboxArrayAdapter(this));
}


@Override
public void checkboxClicked(CompoundButton buttonView, boolean isChecked){
 // stuff with checkbox
}

//..]
}
[COLOR=#000000][B]public[/B][/COLOR] [COLOR=#000000][B]class[/B][/COLOR] CheckboxListAdapter [COLOR=#000000][B]extends[/B][/COLOR] ArrayAdapter<String>{
public interface CheckboxCallback{
    public void checkboxClicked(CompoundButton buttonView, boolean isChecked);
}

private CheckboxCallback callback
  public CheckboxListAdapter(Context context, 
CheckboxCallback callback){
   //...
}

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
  if (convertView == null) {
  //neuen View anlegen mit eigenem Layout
  }
  
//checkbox hohlen
  ((CheckBox)convertView.getViewById(..)).setOnChangeListener(new ...{
      @Override
     public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
    callback.checkboxClicked(buttonView, isChecked);            
      }
  }
  
}




}

vielleicht hilft dir das Weiter, ich hab das nur mal geschrieben um zu verdeutlichen was ich meine
 
C

ChrisFand

Neues Mitglied
Ok, ich hab das mal so umgesetzt jedoch bekomme schmeißt der mich sofort wieder aus der App raus... "Kopfkratz".
 
C

cocojack42

Ambitioniertes Mitglied
Versuchs mal auf diese Weise:

Code:
ArrayAdapter<String> adp = new ArrayAdapter<String>(.....){
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                
                if(convertView == null){
                    convertView = View.inflate(getApplicationContext(), R.layout.list_mitarbeiter_row, null);
                }
                
                // Hier dein View mit dem krämpel befüllen den du brauchst
                
                Checkbox cb = convertView.findViewById(R.id.checkbox);
                
                
                CheckBox cb=(CheckBox) findViewById(R.id.checkbox);
                cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
         
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if(isChecked){
                            Toast.makeText(getApplicationContext(), "Checked", Toast.LENGTH_SHORT).show();
                        }else{
                            Toast.makeText(getApplicationContext(), "Not Checked", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
                
                
                return super.getView(position, convertView, parent);
            }
        };
 
C

ChrisFand

Neues Mitglied
Also so funktioniert das absolut super, vielen Dank für deine Hilfe.
:thumbsup: