Android, как определить элемент в списке с помощью флажка

Я действительно застрял здесь. То, что я хочу, не просто (для меня), однако я программировал андроид через год. То, что я хочу, это listview с изображением, текстовым полем, флажком и другим текстовым просмотром в каждой строке. Давайте дадим текстовое представление и флажок сначала в макете. Основываясь на этом уроке, мне это удалось (есть много, но для меня это кажется лучшим). У меня есть список, заполненный текстовыми полями и флажками.

Это результат:

Введите описание изображения здесь

Вот как я получаю текст textview, на который я нажимаю:

textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView tv = (TextView) v ; String text_of_clicked_textview = tv.getText().toString(); Log.i("TAG", "" + text_of_clicked_textview); } }); 

Поэтому, когда я нажимаю Mercury, я получаю Mercury в переменной text_of_clicked_textview.

Но как я могу проверить, какой флажок я нажал? Например, я нажимаю на третий флажок, я хочу, чтобы теперь он находится в ряду Земли. Лучше всего было бы, если бы я познакомился как с текстом textview в строке списка ( Земля ), так и с номером элемента ( 3 ).

Думаю, я должен установить onClickListener в поле, но что дальше?

 checkBox.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { CheckBox cb = (CheckBox) v ; } }); 

Это XML для Custom Row в ListView:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/camera_icon" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> </LinearLayout> 

Это полная активность, в которой реализован список: просто скопируйте эту операцию для теста, а затем ознакомьтесь с кодом. Поместите один список в основную активность

 package com.DemoTest; import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class CustomList extends Activity implements OnClickListener { ListView listView; ArrayList<EachRow> list=new ArrayList<CustomList.EachRow>(); EachRow each; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); String[] color={"red","green","blue","white","yellow","cyan","purple","grey", "0red","0green","0blue","0white","0yellow","0cyan","0purple","0grey", "1red","1green","1blue","1white","1yellow","1cyan","1purple","1grey"}; for(String str : color) { each=new EachRow(); each.text=str; list.add(each); } listView=(ListView)findViewById(R.id.listView1); listView.setAdapter(new MyAdapter(this, 0, list)); //listView.setOnItemClickListener(this); } class MyAdapter extends ArrayAdapter<EachRow> { LayoutInflater inflat; ViewHolder holder; public MyAdapter(Context context, int textViewResourceId, ArrayList<EachRow> objects) { super(context, textViewResourceId, objects); // TODO Auto-generated constructor stub inflat=LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView==null) { convertView=inflat.inflate(R.layout.row_checkox, null); holder=new ViewHolder(); holder.textView=(TextView)convertView.findViewById(R.id.textView1); holder.image=(ImageView)convertView.findViewById(R.id.imageView1); holder.check=(CheckBox)convertView.findViewById(R.id.checkBox1); holder.check.setOnClickListener(CustomList.this); convertView.setTag(holder); } holder=(ViewHolder) convertView.getTag(); EachRow row= getItem(position); Log.d("size", row.text); holder.textView.setText(row.text); holder.check.setChecked(row.checkBool); holder.check.setTag(position); return convertView; } @Override public EachRow getItem(int position) { // TODO Auto-generated method stub return list.get(position); } private class ViewHolder { TextView textView; ImageView image; CheckBox check; } } private class EachRow { String text; boolean checkBool; } @Override public void onClick(View v) { // TODO Auto-generated method stub EachRow row=list.get((Integer)v.getTag()); row.checkBool=!row.checkBool; Log.d("item", "Item Click at "+(Integer)v.getTag()+" : "+row.text+" is "+row.checkBool); } } 

Лучше, чем добавлять к каждому флажку onClickListener, вы также можете использовать ItemClickListener в своем списке.

Обратитесь к этому сообщению, чтобы узнать, какая строка была нажата: onItemClick <string-array> strings.xml (не ListView / ArrayList)

Существуют и другие варианты, но это связано с созданием класса виджета класса и передачи его позиции в строке, когда ваш адаптер создает или обновляет его.

Вам нужно будет иметь onTouchListener в контейнере, который содержит все их, и убедитесь, что вы возвращаете false на своих слушателей, чтобы они не потребляли событие. OnClickListener потребляет его автоматически.

Если вы заинтересованы только в тексте и флажке, вы можете использовать это

В XML:

 <ListView android:id="@+id/listViewCursor" android:layout_width="fill_parent" android:layout_height="wrap_content" android:choiceMode="multipleChoice" > String[] color={"red","green","blue","white","yellow","cyan","purple","grey"}; list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, color)); 

ANd на каком-либо событии проверяет, какие флажки выбраны.

 SparseBooleanArray boolArray=list.getCheckedItemPositions(); int size=list.getCount(); for(int i=0;i<size;i++) { if(boolArray.valueAt(i)==true) { Log.d("size", color[i]); } }