我有一个带有自定义列表行的列表视图。在每个列表视图的行中,有一个广播组,其中包含2个单选按钮。
我需要动态地了解 ListView (已选中或未选中)的每一行 RadioButtons 的状态,因为用户点击其中一个< strong> RadioGroup的选项。
我的主要xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff3f2f2"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="#00ffffff"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00ffffff"
android:gravity="center_horizontal"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="@string/titulo_cabecalho"
android:textColor="#ff000000"
android:textSize="36sp" >
</TextView>
</RelativeLayout>
<!-- Footer aligned to top -->
<include layout="@layout/footer" />
<RelativeLayout
android:id="@+id/selectEscola"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/footer"
android:layout_below="@id/header"
android:layout_centerInParent="true"
android:layout_marginBottom="10dp"
android:layout_marginTop="4dp"
android:background="#00ffffff"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Chamada"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#c0000000" />
<ScrollView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="80dp"
android:layout_marginBottom="80dp"
android:scrollbars="none"
android:background="@drawable/border" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ListView
android:id="@+id/listChamada"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:padding="2dp" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
</RelativeLayout>
我的自定义行是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"
android:padding="2dip"
android:background="@drawable/border2" >
<LinearLayout
android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="34dip"
android:layout_alignParentLeft="true"
android:layout_marginRight="5dip"
android:padding="3dip"
android:orientation="horizontal" >
<ImageView
android:id="@+id/listEdit"
android:layout_width="24dip"
android:layout_height="24dip"
android:layout_marginTop="2dip"
android:src="@drawable/list" />
<ImageView
android:id="@+id/list_image"
android:layout_width="24dip"
android:layout_height="24dip"
android:layout_marginLeft="20dip"
android:layout_marginTop="2dip"
android:src="@drawable/boy" />
</LinearLayout>
<TextView
android:id="@+id/nomealuno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/matriculaaluno"
android:layout_alignTop="@+id/thumbnail"
android:text="Nome:"
android:textColor="#040404"
android:textSize="18sp"
android:textStyle="bold"
android:typeface="sans" />
<TextView
android:id="@+id/matriculaaluno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/nomealuno"
android:layout_marginTop="2dp"
android:layout_toRightOf="@+id/thumbnail"
android:text="Matrícula: "
android:textColor="#343434"
android:textSize="10sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="4dp"
android:orientation="vertical" >
<RadioGroup
android:id="@+id/radiogroupChamada"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:textColor="#343434"
android:textSize="12sp"
android:textStyle="bold" >
<RadioButton
android:id="@+id/radiobuttonPresente"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@null"
android:drawableRight="@drawable/btn_check"
android:paddingLeft="22dip"
android:text="Presente" >
</RadioButton>
<RadioButton
android:id="@+id/radiobuttonAusente"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@null"
android:drawableRight="@drawable/btn_check"
android:paddingLeft="22dip"
android:text="Ausente" >
</RadioButton>
</RadioGroup>
</LinearLayout>
</RelativeLayout>
这就是我填充ListView的方式:
1 - 将从服务器接收的数据以Json格式接收的代码,在数组和hashmap中(我使用数组引用ListView和hashmap中存在的数据来填充它):
if (success2 == 1) // If data from server was sent without errors
{
int lenght = jArray.length();
optionsMatriculas = new ArrayList<String>(lenght);
optionsNomesAlunos = new ArrayList<String>(lenght);
optionsSexoAlunos = new ArrayList<String>(lenght);
for (int i = 0; i < jArray.length(); i++)
{
try
{
JSONObject oneObject = jArray.getJSONObject(i);
resultDataCodigoAluno = oneObject.getString("cdaluno");
resultDataNomes = oneObject.getString("nome");
resultDataSexo = oneObject.getString("sexo");
optionsMatriculas.add(resultDataCodigoAluno);
optionsNomesAlunos.add(resultDataNomes);
optionsSexoAlunos.add(resultDataSexo);
HashMap<String, String> hm = new HashMap<String, String>();
if (resultDataSexo.equals("M"))
{
hm.put("sexo", Integer.toString(R.drawable.boy));
}
else
{
hm.put("sexo", Integer.toString(R.drawable.girl));
}
hm.put("matricula", resultDataCodigoAluno);
hm.put("nome", resultDataNomes);
alunosLista.add(hm);
}
catch (JSONException e)
{
Log.e("log_tag", "Error in parsing JSon: " + e.toString());
}
}
Message msg = myHandler.obtainMessage();
myHandler.sendMessage(msg);
}
这是填充列表视图的代码:
final Handler myHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
try
{
SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), alunosLista, R.layout.list_row, from, to);
listaChamada.setAdapter(adapter);
int lenght = adapter.getCount();
int totalHeight = 0;
for (int i = 0; i < lenght; i++)
{
View listItem = adapter.getView(i, null, listaChamada);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listaChamada.getLayoutParams();
params.height = totalHeight + 4 + (listaChamada.getDividerHeight() * (adapter.getCount() - 1));
listaChamada.setLayoutParams(params);
listaChamada.requestLayout();
}
catch (Exception e)
{
Log.e("log_tag", "Erro no ListView: " + e.toString());
}
}//handleMessage
};//myHandler
我在谷歌搜索过,但仍然没有运气。 感谢您对此的任何线索。
答案 0 :(得分:0)
实际上,Android适配器并不那么简单。 SimpleAdapter
只能应用于一些非常简单/无关紧要的情况。通常,最好创建自己的BaseAdapter
:它提供了更大的灵活性,并且不需要大量代码。
在您的情况下,我建议使用如下的smth(您未能在from
构造函数中提供to
和SimpleAdapter
的任何信息,所以我猜到了:
主要部分是适当的适配器,它应存储所选的单选按钮ID并将其提供给活动/接收器。
<强> MyAdapter.java 强>
public class MyActivity extends Activity implements MyListAdapter.RadioButtonsListener {
private static final String TAG = "MyActivity";
ArrayList<HashMap<String, String>> mAlunosLista = new ArrayList<HashMap<String, String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ListView listaChamada = (ListView) findViewById(R.id.listChamada);
// Fill list with data
Random sexGen = new Random();
for (int i = 0; i < 20; i++) {
addTextData(sexGen.nextBoolean() ? "M" : "F", Integer.toString(i + 100), "Name" + i + " Surname" + i);
}
final MyListAdapter adapter = new MyListAdapter(mAlunosLista);
listaChamada.setAdapter(adapter);
}
@Override
protected void onResume() {
super.onResume();
final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();
adapter.setRadioListener(this);
}
@Override
protected void onPause() {
super.onPause();
final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();
adapter.setRadioListener(null);
}
/**
* Adds test data to adapter array
*/
private void addTextData(final String resultDataSexo, final String resultDataCodigoAluno, final String resultDataNomes) {
HashMap<String, String> hm = new HashMap<String, String>();
// NOTE: not sure why you convert ids to strings
if (resultDataSexo.equals("M")) {
hm.put("sexo", Integer.toString(R.drawable.boy));
} else {
hm.put("sexo", Integer.toString(R.drawable.girl));
}
hm.put("matricula", resultDataCodigoAluno);
hm.put("nome", resultDataNomes);
mAlunosLista.add(hm);
}
@Override
public void onRadioButtonClicked(final int position, final HashMap<String, String> itemData, final int clickedId) {
Log.d(TAG, "Clicked item at " + position + ", checked id: " + (clickedId == R.id.radiobuttonPresente ? "Presente" : "Ausente"));
}
}
在其他文件下面我已经更改为具有可编辑的示例(请参阅help topic如何询问有关代码问题的问题。)
<强> main.xml中强>
<?xml version="1.0" encoding="utf-8"?>
<!--suppress AndroidLintUselessParent, AndroidLintContentDescription -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff3f2f2"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="#00ffffff"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00ffffff"
android:gravity="center_horizontal"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:text="Title"
android:textColor="#ff000000"
android:textSize="36sp" >
</TextView>
</RelativeLayout>
<!-- Footer aligned to top
<include layout="@layout/footer" />
-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/footer"
android:layout_alignParentBottom="true" />
<RelativeLayout
android:id="@+id/selectEscola"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_above="@id/footer"
android:layout_below="@id/header"
android:layout_centerInParent="true"
android:layout_marginBottom="10dp"
android:layout_marginTop="4dp"
android:background="#00ffffff"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Chamada"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#c0000000" />
<ListView
android:id="@+id/listChamada"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:divider="#b5b5b5"
android:dividerHeight="1dp"
android:listSelector="@android:drawable/list_selector_background"
android:padding="2dp" />
</RelativeLayout>
</RelativeLayout>
<强> list_row.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal"
android:padding="2dip"
android:background="@android:color/darker_gray" >
<LinearLayout
android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="5dip"
android:padding="3dip"
android:orientation="horizontal" >
<ImageView
android:id="@+id/listEdit"
android:layout_width="24dip"
android:layout_height="24dip"
android:layout_marginTop="2dip"
android:src="@android:drawable/ic_menu_add" />
<ImageView
android:id="@+id/list_image"
android:layout_width="24dip"
android:layout_height="24dip"
android:layout_marginLeft="20dip"
android:layout_marginTop="2dip"
android:src="@android:drawable/ic_delete" />
</LinearLayout>
<TextView
android:id="@+id/nomealuno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/matriculaaluno"
android:layout_alignTop="@+id/thumbnail"
android:text="Nome:"
android:textColor="#040404"
android:textSize="18sp"
android:textStyle="bold"
android:typeface="sans" />
<TextView
android:id="@+id/matriculaaluno"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/nomealuno"
android:layout_marginTop="2dp"
android:layout_toRightOf="@+id/thumbnail"
android:text="Matrícula: "
android:textColor="#343434"
android:textSize="10sp" />
<RadioGroup
android:id="@+id/radiogroupChamada"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/thumbnail"
android:orientation="vertical"
android:textColor="#343434"
android:textSize="12sp"
android:textStyle="bold" >
<RadioButton
android:id="@+id/radiobuttonPresente"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="22dip"
android:text="Presente" />
<!--android:drawableRight="@drawable/btn_check"-->
<RadioButton
android:id="@+id/radiobuttonAusente"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="22dip"
android:text="Ausente" />
<!--android:drawableRight="@drawable/btn_check"-->
</RadioGroup>
</RelativeLayout>
<强> MyActivity.java 强>
public class MyActivity extends Activity implements MyListAdapter.RadioButtonsListener {
private static final String TAG = "MyActivity";
ArrayList<HashMap<String, String>> mAlunosLista = new ArrayList<HashMap<String, String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ListView listaChamada = (ListView) findViewById(R.id.listChamada);
// Fill list with data
Random sexGen = new Random();
for (int i = 0; i < 20; i++) {
addTextData(sexGen.nextBoolean() ? "M" : "F", Integer.toString(i + 100), "Name" + i + " Surname" + i);
}
final MyListAdapter adapter = new MyListAdapter(mAlunosLista);
listaChamada.setAdapter(adapter);
}
@Override
protected void onResume() {
super.onResume();
final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();
adapter.setRadioListener(this);
}
@Override
protected void onPause() {
super.onPause();
final MyListAdapter adapter = (MyListAdapter) ((ListView) findViewById(R.id.listChamada)).getAdapter();
adapter.setRadioListener(null);
}
/**
* Adds test data to adapter array
*/
private void addTextData(final String resultDataSexo, final String resultDataCodigoAluno, final String resultDataNomes) {
HashMap<String, String> hm = new HashMap<String, String>();
// NOTE: not sure why you convert ids to strings
if (resultDataSexo.equals("M")) {
hm.put("sexo", Integer.toString(R.drawable.boy));
} else {
hm.put("sexo", Integer.toString(R.drawable.girl));
}
hm.put("matricula", resultDataCodigoAluno);
hm.put("nome", resultDataNomes);
mAlunosLista.add(hm);
}
@Override
public void onRadioButtonClicked(final int position, final HashMap<String, String> itemData, final int clickedId) {
Log.d(TAG, "Clicked item at " + position + ", checked id: " + (clickedId == R.id.radiobuttonPresente ? "Presente" : "Ausente"));
} }
PS此外,看起来你正试图对ListView
进行攻击。我不知道为什么你需要它,但最好避免直到完全必要。