如何在唯一的ListView位置访问视图?

时间:2017-01-10 22:12:09

标签: android

我有一个列表视图,我正在调整list_item.xmllist_item.xml只是一个CheckBox

的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

 <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

当我点击其中一个复选框时,我希望取消选中其他复选框。因此,在getView方法的适配器中,我将CheckBox添加到CheckboxManager singelton类。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View list_item = convertView;//View Recycling

    if (list_item == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        list_item = vi.inflate(R.layout.database_item, null);
    }

    DatabaseItem databaseItem = getItem(position);

    if (databaseItem != null) {

        TextView textView = (TextView) list_item.findViewById(R.id.database_name);
        CheckBox checkBox = (CheckBox) list_item.findViewById(R.id.checkBox);

        if (textView != null) {
            textView.setText(databaseItem.getTitle());
        }

        if (checkBox != null) {
            CheckboxManager cbm = CheckboxManager.getInstanceOf(activity);
            cbm.addCheckbox(checkBox, databaseItem.getQuery());
        }

    }

    return list_item;
}

在我的CheckboxManager单身人士课程中,我将CheckBox次观点累积为ArrayList。我在复选框中设置了一个单击监听器,并在迭代数组列表检查其中一个时取消选中它们。

问题是我的数组列表大小总是一个!由于我正在调整list_item.xml的五个实例,我预计会有五个独特的CheckBox视图,但显然只有一个,因为我的ArrayList只有1个大小(可能是因为视图回收? )。

如何访问所有复选框并取消选中它们?

修改

public class CheckboxManager {

    private ArrayList<CheckBox> cbs = new ArrayList<>();
    private static CheckboxManager singleton = null;
    private static Activity activity = null;

    private CheckboxManager(Activity activity){ this.activity = activity;}

    // This is the only class method; the rest are instance methods.
    public static CheckboxManager getInstanceOf(Activity activity){

        if(null == singleton) return new CheckboxManager(activity);
        return singleton;
    }

    public void addCheckbox(CheckBox cb, String query){

        addClickListener(cb, query);
        cbs.add(cb);
    }

    private void addClickListener(final CheckBox cb, final String query){

        cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

               @Override
               public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                   // A box has been checked
                   if(true == isChecked) {
                       uncheckOtherBoxes(cb);
                       Movies.swapCursor(getCursor(query), activity);
                   }
               }
           }
        );
    }

    private void uncheckOtherBoxes(CheckBox cb){
        int idx = cbs.indexOf(cb);
        Log.v("TAG","Size of list is "+cbs.size());
        for(int i=0;i<cbs.size();i++){
            if(idx != i){
                cb.setChecked(false);
            }
        }
    }

    private Cursor getCursor(String query){
        SQLiteDatabase db = DatabaseHelper.getInstanceOf(activity).getDatabase();
        return db.rawQuery(query, null);
    }
}

1 个答案:

答案 0 :(得分:1)

你的单身人士形成不正确。

这是错误的。你可以看到它每次只返回一个新实例,因为它从未在第一次存储它。

public static CheckboxManager getInstanceOf(Activity activity){

    if(null == singleton) return new CheckboxManager(activity);
    return singleton;
}

应该是......

public static CheckboxManager getInstanceOf(Activity activity){

    if(null == singleton) 
       singletone = new CheckboxManager(activity);
    return singleton;
}