2016-07-15 2 views
0

그래서 나는 즉시 작성한 사용자 정의 어댑터에서 목록 항목의 모양을 변경할 수 있도록 노력하고 있습니다. 내 사용자 지정 어댑터 목록 항목 내에서 단추를 클릭하면 변경할 싶습니다. This is an example of a Custom List Item looks like. 버튼을 클릭하면 레이아웃 수정 작업을 수행해야합니다. 예를 들어 Button을 클릭 한 후에 다른 단추를 숨기거나 단추의 텍스트를 변경하려고합니다. 어떤 이유로 이러한 명령을 클릭해도 아무 효과가없는 것 같습니다.내부 버튼 클릭시 사용자 정의 어댑터 내용 업데이트

궁극적 인 목표는 버튼 클릭으로 목록 항목의 크기를 조정할 수있게하는 것입니다. 그러나 내가 언급했듯이 아무런 효과가없는 것 같습니다. 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()를 호출합니다. 하나의 로직이 필요하고 버튼의 가시성을 관리해야합니다.

+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; 
    } 
} 

잘하면이게 잘 될거야.

관련 문제