gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:27:11 26 4
gpt4 key购买 nike

我很确定这是可能的,但奇怪的是找不到方法。所以,我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com