android - 具有复杂行项目的 ListActivity : how to access row views?

标签 android android-ui

我很确定这是可能的,但奇怪的是找不到方法。 所以,我有一个 ListActivity。我希望这是它的行元素:

<?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="horizontal" >

    <CheckBox
        android:id="@+id/checkbox"
        style="@style/CheckBox" />

    <TextView
        android:id="@+id/text"
        style="@style/Label"
        android:layout_width="fill_parent"
        android:layout_height="50sp"
        android:gravity="center_vertical" />

</LinearLayout>

我已经可以使用这个布局,我知道如何在创建 ArrayAdapter 时指定 TextView 的 id。布局很好,我可以勾选复选框。

问题是,我不明白如何访问这些复选框。我需要一个膨胀的行布局来调用 findViewById,但它是异步膨胀的,不是在我将项目添加到适配器时立即膨胀的。如何做到这一点?

最佳答案

When a CheckBox is checked, I need to uncheck all other checkboxes and store the index of a checked one

这是我现在想到的解决方案。我现在不知道您的实现(适配器的实现、数据源等),因此您可能需要进行一些修改。所以现在我的解决方案:

你需要onCheckedChangedListener并放入您的 ListAdapter 类:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   // do your stuff
}

现在我不知道您的实际情况,但很可能您有一些要传递给适配器的对象集合,并且您在返回行 View 的 getView() 方法中使用它。

正是在这里,我建议修改您的对象(代表适配器中每一行的项目)并添加属性:

private boolean isChecked;

这将“代表”您的 CheckBox

现在隐式地每个 CheckBox 都将被取消选中(这没关系,因为 bool 值被隐式地分配给 false)。

现在直接进入Adapter类。在您的类(class)中,正是在您的 getView() 中,您需要执行以下操作:

public View getView(final int position, View convertView, ViewGroup parent) {
   RowHolder holder = null; // RowHolder that holds widgets for each row
   LayoutInflater inflater = LayoutInflater.from(context); // for inflate rows

   // logic for inflating rows, pretty simply
   if (convertView == null) {
      // inflate row
      convertView = inflater.inflate(<yourLayout>, null, false);
      holder = new RowHolder(convertView);
      convertView.setTag(holder);
   }
   else {
      // recycle row
      holder = (RowHolder) convertView.getTag();
   }

   // inicialising row values
   final Item i = collection.get(position); // item from collection

   /** here will be work with CheckBoxes **/

   // here you will set position as CheckBox's tag
   holder.getCheckBox().setTag(position);

   // set CheckBox checked or not due to item in collection
   holder.getCheckBox().setChecked(item.isChecked());

   // and assign listener to CheckBox
   holder.getCheckBox().setOnCheckedChangeListener(this);
}

这是非常重要的逻辑。在这里,您将 Adapter 中 CheckBox 的位置保存到 CheckBox 本身中。现在 CheckBox 知道“位于何处”

然后您的听众将进行以下操作:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   // buttonView is CheckBox you changed state so we know which CheckBox it is
   int position = (Integer) buttonView.getTag();

   // if CheckBox is checked
   if (isChecked) {

      // iterate collection and assign all items except selected into false
      for (int i = 0; i < collection.size(); i++) {
         if (i != position) {
            collection.get(i).setChecked(false);
         }
      }

      // now call notifyDataSetChanged() that will call getView() method again
      // and it will update your List
      notifyDataSetChanged();
   }  
}

这里listener会搞个把戏。还有一些关于

希望它能帮助您实现目标。

关于android - 具有复杂行项目的 ListActivity : how to access row views?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144083/

相关文章:

java - 从 JNI 发送 float 到 Java 代码添加 2 个数字

android - 如何在android中的网格中显示图像?

android - 如何制作一个像样的用户界面

android - EditText的光标位置

带抽屉导航的 Android 布局

android - 在Android中旋转矩形位图

android - 声音和显示同步问题

java - Android KSoap 错误

Android:pcm_open 失败无法打开设备 '/dev/snd/pcmC0D1p'

android - undefined reference 错误 - rand