0

のカスタムListViewがあるbuttonので、をクリックするbuttonと消えるはずですが、下にスクロールして戻るとbuttonが再び表示され、別のbuttonが消えます。クリックすると特定のものが消えるようにするにはどうすればよいbuttonですか....私はこのコードを使用しています

holder.checkbox = (Button) view.findViewById(R.id.checkBox1);

holder.checkbox.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
    holder.checkbox.setVisibility(View.INVISIBLE);
4

7 に答える 7

2

ListView では、項目が画面の外に出ると、効率のために ListView が項目を破棄し、その項目にスクロールして戻るときに、アダプターの getView() メソッドを呼び出して項目を再作成するため、ボタンのステータスのブール値を持つ配列を保持する必要があります。これはデフォルトで true であり、getView() では、ブール配列からステータスのブール値を取得してチェックを入れるだけで、true の場合はアイテムが表示され、それ以外の場合はアイテムが非表示になります。したがって、アイテムを消すときは、アイテムのステータスも false に設定する必要があります。これは getView() のコードであり、ListView のアイテムと同じ長さのブール値の配列と、「yourButtonStatusBooleanArray」という名前の true の値を既に定義していると仮定すると、次の変更が機能します。

holder.checkbox = (Button) view.findViewById(R.id.checkBox1);

if(!yourButtonStatusBooleanArray[position])
{
 holder.checkbox.setVisibility(View.INVISIBLE);
}
holder.checkbox.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
holder.checkbox.setVisibility(View.INVISIBLE);
yourButtonStatusBooleanArray[position]=false;
于 2013-04-30T08:17:22.080 に答える
1

ビューはリストビューで再利用されます。ボタンの状態をある種のデータ構造に保存し、それをアダプタに設定する必要がありgetView(int, View, ViewGroup)ます。

private HashMap<Integer, Boolean> mButtonMap = new HashMap<Integer, Boolean>();

[...]

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

    // Do all your stuff with each row



    if (!mButtonMap.containsKey(new Integer(position))) {
        button.setVisibility(View.VISIBLE);
    }
    else {
        button.setVisibility(View.INVISIBLE);
    }
    button.setTag(""+position);
    return retVal;
}

//In your onClickListener
    onClick(View v) {
        [...]
        int position = Integer.parseInt((String) v.getTag());
        mButtonMap.put(position, true); 
        button.setVisibility(View.INVISIBLE);
    }
于 2013-04-30T08:28:58.607 に答える
1

holder.checkbox.setVisibility(View.VISIBLE);ボタン宣言の後に追加してみてください

于 2013-04-30T08:10:51.427 に答える
1

次のようなことができます:

public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;
        if (convertView == null) {
            vi = inflater.inflate(R.layout.grid_adapter, null);
            holder = new ViewHolder();
            holder.checkbox = (Button) view.findViewById(R.id.checkBox1);
            holder.checkbox.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    if (arg0.getTag().equals("0")) {
                        arg0.setVisibility(View.INVISIBLE);
                        arg0.setTag("1");
                    }
                    notifyDataSetChanged();
                }
            });

            vi.setTag(holder);
        } else
            holder = (ViewHolder)vi.getTag();

        try {

            if (holder.checkbox.getTag().equals("1")) {
                holder.checkbox.setVisibility(View.INVISIBLE);
            } else {
                holder.checkbox.setVisibility(View.VISIBLE);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return vi;
    }
于 2013-04-30T08:41:21.213 に答える
1

これは、ビューのリサイクルが原因で発生しています。あなたがする必要があるのは、たとえばブール値の配列を維持し、ボタンがクリックされるたびに対応するブール値を切り替えることです。次に、getview で対応するブール配列の位置を確認し、ボタンの状態を設定します。

詳細については、このリンクを参照してください

リストビューのチェックボックスが正しく機能しない

上記の例は、コードを編集するチェックボックス用です。

于 2013-04-30T08:18:40.393 に答える
1

問題は、行のビューが再利用されるため、スクロール後に行ビューに別の行の状態のボタンが表示される可能性があることです。ビューの初期化時にボタンの可視性を明示的に設定することで、この問題を解決できます。そのため、データ オブジェクトや、既に選択されている項目を追跡する配列など、どこかで行の状態を覚えておく必要があります。

holder.checkbox.setVisibility(dataObject.getVisibilityState());

EDITコメントへの回答、ここにコードブロックがあるように示されています

メソッドを自分で実装する必要があります。コードは、カスタム メソッドの使用方法の例にすぎません。したがって、アイテム クラスで次のようなことができます。

 public class Item {
 private int visibility;
 ... other attributes of your item

 public int getVisibilityState(){
  return visibility;
 }

 public void setVisible(){
  visibility = View.VISIBLE;
 }

 public void setInvisible(){
  visibility = View.INVISIBLE;
 }
 }
于 2013-04-30T08:21:33.237 に答える
1

このメソッドを ListAdapter に実装する必要があります。これは、ユーザーがリストをスクロールしたために行のビューが画面外から画面上に移動するたびに呼び出されます。getView メソッドに渡された View は、実際にはまったく別の行のデータを表示するために使用される場合があります。これは、オブジェクトがリサイクルされるためです。1,000 行のデータがあり、8 つのビューしか画面に収まらない場合、システムは行に対して 1,000 ではなく 8 つのビュー オブジェクトを作成します。

クラスが ListAdapter を実装している場合、次のように getView メソッドをオーバーライドできます。

public class MyClass implements ListAdapter {

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

View rowView = convertView;

//Create a view for this row if none exists yet
if (rowView == null) {
  LayoutInflater inflater = (LayoutInflater) _context
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  rowView = inflater.inflate(R.layout.YOUR_ROW_LAYOUT, parent, false);

//make the button go away if it should not be visible
if (buttonShouldBeNotVisible(convertView)) {  //Your code should determine this
    convertView.checkbox.setVisibility(View.INVISIBLE);  
    //Use View.GONE to make it take up no space
}
return convertView

} }

于 2013-04-30T08:24:19.530 に答える