2016-07-15 6 views
0

私は、その場で作成したカスタムアダプタからリストアイテムの外観を変更できるようにしようとしています。カスタムアダプターのリストアイテム内からボタンをクリックしたときに変更したいのですが。 This is an example of a Custom List Item looks like. ボタンをクリックすると、レイアウトを変更するアクションを実行します。たとえば、ボタンをクリックした後、別のボタンを非表示にするか、ボタンのテキストを変更します。何らかの理由で、これらのコマンドをクリックしても効果がないようです。カスタムボタンの内容を内部ボタンで更新する

私の究極の目標は、ボタンクリックでリストアイテムのサイズを変更できるようにすることです。しかし、私が言及したように、何も効果がないようです。 onClickメソッドの外部での可視性の設定はうまくいくようですが、内部で行うことはできません。私は、コードに到達していることを知っているが、私はそれがアダプタの更新ではないとは思うが、私はそこにnotifyDataSetChangedメソッドがあります。どんな助けもありがとうございます。ありがとう。 notifyDataSetChangedを呼び出す

class CustomAdapter extends ArrayAdapter<Player> { 

private static class ViewHolder { 
    Button button, button2; 
} 

public CustomAdapter(Context context, ArrayList<Player> players) { 
super(context, R.layout.player_expanded, players); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewHolder viewHolder; // view lookup cache stored in tag 
    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater infater = LayoutInflater.from(getContext()); 
final View customView = infater.inflate(R.layout.custom_list_item, parent, false); 

viewHolder.button = (Button) customView.findViewById(R.id.button); 
viewHolder.button2 = (Button) customView.findViewById(R.id.button2); 

viewHolder.button.setTag(position); 
viewHolder.button2.setTag(position); 
convertView.setTag(viewHolder); 
} else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
} 
viewHolder.button2.setVisibility(View.VISIBLE); 
viewHolder.button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     viewHolder.button2.setVisibility(View.GONE); //Doesn't take effect 
     notifyItemChanged(Integer.valueOf(v.getTag().toString())); 
    } 
}); 

return customView; 
} 
} 
+0

あなたのbuttonGoneは何ですか? –

+0

申し訳ありませんが、ちょうどタイプミスです。一定。 – CrossStitch

+0

android:focusable = "false"削除してみてください – comeback4you

答えて

0

は、以下のようにしてください私のカスタム・アダプタのコード

class CustomAdapter extends ArrayAdapter<Player> { 
Button button, button2; 

public CustomAdapter(Context context, ArrayList<Player> players) { 
    super(context, R.layout.player_expanded, players); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater infater = LayoutInflater.from(getContext()); 
    final View customView = infater.inflate(R.layout.custom_list_item, parent, false); 

    button = (Button) customView.findViewById(R.id.button); 
    button2 = (Button) customView.findViewById(R.id.button2); 
    button2.setVisibility(View.VISIBLE); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      button2.setVisibility(View.GONE); //Doesn't take effect 
      notifyDataSetChanged(); 
     } 
    }); 

    return customView; 
    } 
} 

そして、私のCustom_List_Item.xmlです。 setVisibilityがなくなり、表示されているすべての項目に対してgetView()を呼び出します。 これは1つのロジックが必要で、ボタンの可視性を管理します。

+0

多かれ少なかれこれが機能しました。これは私が(viewHolderを使用して)取る必要があるアプローチでした。どうもありがとうございました! – CrossStitch

+0

:)ハッピーコーディング.. – Drv

0

()すべてを再構築するリストビューが発生します。

はここ

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textView3" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:layout_alignParentTop="true" 
    android:focusable="false" 
    android:id="@+id/button" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:focusable="false" 
    android:id="@+id/button2" /> 
</LinearLayout> 
0

これは、onClickの中にボタンが見えなくなり、アダプタに通知しているために起こります。

今度はbutton2.setVisibility(View.VISIBLE);をアダプタの内側に書きました。アダプタが通知を受けるたびに、ボタンの可視性を再度表示するように設定します。

これを行う簡単な方法は、SparseBooleanArrayです。

class CustomAdapter extends ArrayAdapter<Player> { 

    Button button, button2; 
    SparseBooleanArray mArray; 

    public CustomAdapter(Context context, ArrayList<Player> players) { 
     super(context, R.layout.player_expanded, players); 
     mArray = new SparseBooleanArray(lenth of your list); 
    } 

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

     if (convertView == null) { 
      LayoutInflater infater = LayoutInflater.from(getContext()); 
      final View customView = infater.inflate(R.layout.custom_list_item, parent, false); 

      button = (Button) customView.findViewById(R.id.button); 
      button2 = (Button) customView.findViewById(R.id.button2); 
     } 
     if(mArray.get(position)){ 
      button2.setVisibility(View.GONE); 
     }else if(!mArray.get(position)){ 
      button2.setVisibility(View.VISIBLE); 
     } 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mArray.put(position, true); 
       notifyDataSetChanged(); 
      } 
     }); 

     return customView; 
    } 
} 

これはうまくいきます。

関連する問題