0

画像、テキストビュー、ラジオボタンを表示するカスタムリストビューがあります。一度に1つのアイテム(つまりRadioButton)のみを選択する必要があります。このリストビューにテキストウォッチャーを添付しましたが、すべて正常に機能しています。

問題はここにあります

  1. リストビューで最初のラジオボタンを選択したとしましょう。
  2. EditTextボックスで検索オプションを実行すると、リストビューアイテムがフィルタリングされ、フィルタリングされたリストアイテムが最初の位置に表示されます。
  3. ここでは、最初の位置のフィルタリングされたアイテムもチェックされています(以前に選択されたため)

フィルタリングする前にラジオボタンの状態を保存する必要がありますか?

public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    if ( row == null) {
    //  Log.d(tag,"Starting XML Row Inflation");
        LayoutInflater inflater = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.custom_row_view_user, parent, false);
        Log.d(tag,"Successfully completed XML Row Inflation for positon"+position); 

    }

    // Get item
    final Contact contact = getItem(position);
    contactIcon = (ImageView) row.findViewById(R.id.image_icon);
    name = (TextView) row.findViewById(R.id.textviewname);
    name.setText(contact.name);

            rb = (RadioButton) row.findViewById(R.id.radiobutton1);
            rb.setEnabled(true);

    String imgFilePath = DIR + contact.imageId;
    try {

        Bitmap bitmap = BitmapFactory.decodeStream(this.context.getResources().getAssets().open(imgFilePath));
        contactIcon.setImageBitmap(bitmap);
    } catch(IOException e) {
        e.printStackTrace();
    }

    return row; 

}


// Filter function
@Override
public Filter getFilter() {
    if (filter == null) {
        filter = new ContactFilter();
    }
    return filter;
}

private class ContactFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence prefix) {
        FilterResults results = new FilterResults();
        if( prefix == null || prefix.length() == 0) {
            synchronized (this) {
                results.values = originalContacts;
                results.count = originalContacts.size();
            }
        } else {
            synchronized (this) {
                String prefixString = prefix.toString().toLowerCase();
                final ArrayList<Contact> filteredItems = new ArrayList<Contact>();
                final ArrayList<Contact> localItems = new ArrayList<Contact>();
                localItems.addAll(originalContacts);
                final int count = localItems.size();
                for ( int i=0; i<count; i++) {
                    final Contact contact = localItems.get(i);
                    final String contactName = contact.name.toString().toLowerCase();
                    if ( contactName.startsWith(prefixString) ) {
                        filteredItems.add(contact);

                    } else {

                    }


                }
                results.values = filteredItems;
                results.count = filteredItems.size();
            } // end of synchronized.
        }

        return results;
    }

    @Override
    protected void publishResults(CharSequence prefix,
            FilterResults results) {
        synchronized (this) {

            @SuppressWarnings("unchecked")
            final ArrayList<Contact> localItems = (ArrayList<Contact>)results.values;
            notifyDataSetChanged();
            clear();
            for( Iterator<Contact> iterator = localItems.iterator(); iterator.hasNext();) {
                Contact index = (Contact) iterator.next();
                add(index);
            }

        } // end of syncronized

    }

}

連絡先タイプクラス

public class Contact {
public String name;
public String imageId;
public String type;
public boolean isSelected;
public boolean useDefaultKey;
public boolean flag;

public Contact() {

}

public Contact(String name, String type, String resouceFilePath) {
    this.name = name;
    this.type = type;
    this.imageId = resouceFilePath;
    this.isSelected = false;
    this.useDefaultKey = true;
    this.flag = false;

}

@Override
public String toString() {
    return this.name;
}

public boolean getCheckeBoxStatus() {
    return isSelected;
}

}

そして、私は次のようにLinearLayoutチェック可能メソッドを実装しました

public class CheckableLinearLayout extends LinearLayout implements Checkable{


private RadioButton rb;
public CheckableLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}



@Override
protected void onFinishInflate() {
 super.onFinishInflate();
 // find checked text view
 int childCount = getChildCount();
 for (int i = 0; i < childCount; ++i) {
     View v = getChildAt(i);
     if (v instanceof RadioButton) {
         rb = (RadioButton)v;
     }
 }
}
@Override
public boolean isChecked() {
     return rb != null ? rb.isChecked() : false; 
}

@Override
public void setChecked(boolean checked) {


    if (rb != null) {
    //  Toast.makeText(getContext(), "Clicked radio buttton", Toast.LENGTH_LONG).show();
         rb.setChecked(checked);

         }
}

@Override
public void toggle() {
    if (rb != null) {
         rb.toggle();
         rb.setChecked(false);
         }

}}

どんな助けでも大歓迎です。

4

1 に答える 1

1

アダプタのgetView()メソッドのpositionパラメータを使用してラジオボタンをチェックしようとしている必要があります。代わりに、いくつかのIDに基づいてラジオボタンをチェックするように設定してみてください。

編集:

あなたのコード研究から、あなたがこの例を実装していることがわかりました:

http://tokudu.com/2010/android-checkable-linear-layout/

先に想定したように、ラジオボタンのチェック状態はリストビュー内の行の位置に依存しますが、フィルター上で位置が変更されることを意図したリストビュー内の実際のアイテムには依存しません。コードにいくつかの変更を加えましたが、リストビューのアイテムチェックはアイテムの位置ではなく、アイテム自体に基づいています(連絡先の名前と一致することにより)。

コードの変更は次のとおりです。

HelloListViewActivity:

lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> av, View view, int position,
                    long id) {
                o = av.getItemAtPosition(position);
                String name = ((Contact) o).name;
                selectedName = name;

ContactAdapter:

static boolean isContactChecked = false;
public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        final Contact contact = getItem(position);
        if(contact.name.equalsIgnoreCase(HelloListViewActivity.selectedName))
            isContactChecked = true;
        else
            isContactChecked= false;

CheckableLinearLayout:

@Override
    public void setChecked(boolean checked) {
        if (rb != null) {
            //  rb.setChecked(checked);
            rb.setChecked(ContactAdapter.isContactChecked);
        }
    }
于 2012-01-07T16:30:58.067 に答える