【发布时间】:2017-05-13 16:07:04
【问题描述】:
所以我的主要问题是获得对它们的引用...
我正在使用自定义适配器,因为我有自定义列表项,其中包含 ImageView、TextView、CheckBoxes 等内容。
通过:
MySimpleAdapter adapter = new MySimpleAdapter(this, R.layout.row, content);
listV.setAdapter(adapter);
那么有什么方法可以参考这个复选框吗? 当我通过xml文件将“行”中的复选框的ID设置为“复选框”时,每个列表项/行中的每个复选框都有这个ID吗?
这是怎么做到的? 因为我认为 id 不能引用多个视图? 或者是否自动添加了一个像 checkbox1, checkbox2 这样的后缀? 我可以这样做吗:
// TEMP ARRAY FOR CHECKBOXES
ArrayList<CheckBox> tempCBS = new ArrayList<CheckBox>();
// NUMBER OF LISTITEMS
// int childCount = listV.getChildCount();
int childCount = listV.getCount();
for (int i = 0; i > childCount; i++) {
ViewGroup vg = (ViewGroup) listV.getItemAtPosition(i);
// ONLY ITEMS WITH THIS TAG
CheckBox cBOX = (CheckBox) vg.findViewWithTag("c_BOX");
// IF NOT SUCCESSFUL
if (cBOX.equals(null) || !(cBOX instanceof CheckBox)) {
eLog.debLog(tag, "CHECKBOX IST NULL", context, 0);
eLog.debLog(tag, "FINDEN DER CHECKBOXEN WAR ERFOLGLOS", context,
0);
eLog.debLog(tag, cBOX.toString(), context, 0);
return;
}
// IF SUCCESSFUL
else {
eLog.debLog(tag, "FOUND VALID CHECKBOX ... ADD", context, 0);
tempCBS.add(cBOX);
}
}
当我使用这个...结果Array应该包含CheckBoxes是空的:/
那么如何正确地做到这一点呢? 怎么了? 我什至可以用 findViewById 做到这一点吗? 怎么做才是正确的?
---------编辑-------------
完整的来源:)
活动:
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
public boolean cbsVisible = false;
public ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) this.findViewById(R.id.listV);
// CREATE FAKE DATA
ArrayList<String> fakeD = new ArrayList<String>();
fakeD.add("sadfasdf");
fakeD.add("dsgdfg");
fakeD.add("jkl");
fakeD.add("iul");
fakeD.add("tzru");
// SETZTE LISTENINHALT
MySimpleAdapter adapter = new MySimpleAdapter(this, R.layout.row, fakeD);
// ZEIGE LISTENINHALT
lv.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void togChecks(View v) {
// //WENN NICHT SICHTBAR
// if(v.getVisibility() == View.GONE) {
// v.setVisibility(View.VISIBLE);
// }
// //WENN SICHTBAR
// else {
// v.setVisibility(View.GONE);
// }
// BULLSHIT HAHA :D
// CREATE/GET ARRAY OF CHECKBOXES
// ArrayList<CheckBox> cbs = new ArrayList<CheckBox>();
// cbs = lv.getr
// TEMP ARRAY FOR CHECKBOXES
ArrayList<CheckBox> tempCBS = new ArrayList<CheckBox>();
// NUMBER OF LISTITEMS
// int childCount = listV.getChildCount();
int childCount = lv.getCount();
for (int i = 0; i > childCount; i++) {
ViewGroup vg = (ViewGroup) lv.getItemAtPosition(i);
// ONLY ITEMS WITH THIS TAG
CheckBox cBOX = (CheckBox) vg.findViewWithTag("c_BOX");
// IF NOT SUCCESSFUL
if (cBOX.equals(null) || !(cBOX instanceof CheckBox)) {
Toast.makeText(this, "CHECKBOX IST NULL", Toast.LENGTH_SHORT);
Toast.makeText(this, "FINDEN DER CHECKBOXEN WAR ERFOLGLOS",
Toast.LENGTH_SHORT);
Toast.makeText(this, cBOX.toString(), Toast.LENGTH_SHORT);
return;
}
// IF SUCCESSFUL
else {
Toast.makeText(this, "FOUND VALID CHECKBOX ... ADD",
Toast.LENGTH_SHORT);
tempCBS.add(cBOX);
}
}
// WENN CHECKBOXEN SICHTBAR
if (cbsVisible) {
for (CheckBox cb : tempCBS) {
cb.setVisibility(View.GONE);
}
cbsVisible = false;
}
// WENN NICHT SICHTBAR
else {
for (CheckBox cb : tempCBS) {
cb.setVisibility(View.VISIBLE);
}
cbsVisible = true;
}
}
}
适配器:
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class MySimpleAdapter extends ArrayAdapter {
ArrayList<String> titles;
Context context;
public MySimpleAdapter(Context context, int resource, ArrayList<String> fakeD) {
// KONSTRUKTORAUFRUF DATEN MITGEBEN
super(context, resource, fakeD);
this.context = context;
this.titles = fakeD;
// TODO Auto-generated constructor stub
}
// MUSS ÜBERSCHRIEBEN WERDEN UM JEDES EINZELNE VIEW VOM LISTENELEMENT BEIM
// ERSTELLEN DER LISTE ANZUPASSEN
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// return super.getView(position, convertView, parent);
// SUPER METHODE ÜBERSCHREIBEN
// UM INHALT ANZUPASSEN
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View list_item = inflater.inflate(R.layout.row, parent, false);
// ANPASSEN
TextView tempTXT = (TextView) list_item.findViewById(R.id.textView1);
tempTXT.setText("" + titles.get(position));
// MACHE CHECKBOXEN UNSICHTBAR
// UM ALLE DANN WIEDER SICHTBAR ZU MACHEN ÜBER MAINACTIVITY
// TODO AUF DIESES ELEMENT ÜBER MAINACTIVITY ZUGREIFEN
CheckBox cb = (CheckBox) list_item.findViewById(R.id.checkBox1);
cb.setVisibility(View.GONE);
// ANGEPASSTEN INHALT WIEDERGEBEN
return list_item;
}
}
布局:
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.listviewcustomadapter.MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#344"
android:gravity="center"
android:text="Custom ListView Sample"
android:textSize="40sp" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:onClick="togChecks"
android:text="toggle checkboxes" />
<ListView
android:id="@+id/listV"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/button1"
android:layout_below="@id/textView1" >
</ListView>
</RelativeLayout>
所以单击按钮 1 应该切换复选框,但没有任何反应...... 怎么了?
【问题讨论】:
-
CheckBox cBOX = (CheckBox) vg.findViewById(R.id.the_ID_Asigned_In_Xml);
-
那么每个复选框都有相同的 id 吗?
-
是的,但是每个 CheckBox 是一个不同的对象实例
-
但是它不起作用...我已经添加了完整的代码,你能找到错误吗?
-
您可以通过它们的位置获取复选框,但是如果您想获取它们的实例,请像这样更改您的适配器构造函数。
public MySimpleAdapter( Context context, int resource, ArrayList<String> fakeD,List<CheckBox> listCheckbox) { // KONSTRUKTORAUFRUF DATEN MITGEBEN super(context, resource, fakeD); this.context = context; this.titles = fakeD; // TODO Auto-generated constructor stub }并在适配器类中创建一个 List字段并将您的 ChekBox 实例添加到此列表中。您在活动中的原始列表将有参考