2013-10-13 5 views
0

사용자가 선택할 수있는 숫자 목록이 있습니다. 번호를 선택하면 선택한 번호의 상태를 저장하고 앱이 다시 시작될 때 해당 번호의 상태를 복원 할 수 있습니다.GridView에서 TextView 항목을 얻는 방법

현재 onCreateView이 호출 될 때 GridView의 항목을 가져 와서 상태를 복원하는 데 어려움이 있습니다. 내가 gridView.getChildCount() 전화를 시도하고 0을 반환합니다 통지. 나는 비슷한 문제가 많은 스레드를 읽고 그들의 대답을 시도했지만 성공했다. 나는 이미 며칠 동안이 일을 해왔다.

Fragment1.java :

public class Fragment1 extends Fragment implements OnItemClickListener { 

public static final String ARG_SECTION_NUMBER = "section_number"; 

private static final int START_NUM = 1; 
private static final int END_NUM = 59; 
public static boolean[] num_select = new boolean[END_NUM - START_NUM + 1]; 

private static GridView gridView; 
private static NumberAdapter adapter; 

public Fragment1() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_1, container, false); 

    gridView = (GridView) rootView.findViewById(R.id.gridview_number); 

    adapter = new NumberAdapter(getActivity(), START_NUM, END_NUM); 
    gridView.setAdapter(adapter); 
    //gridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE); 

    gridView.setOnItemClickListener((OnItemClickListener) this); 

    // ************* I NEED TO BE ABLE TO RESTORE THE NUMBER STATE HERE ******* 
//restoreNumbers(); 

    return rootView; 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

num_select[position] = !num_select[position]; 

    if (num_select[position]) 
    { 
     v.getBackground().setColorFilter(Color.rgb(210, 230, 230), 
    } 
    else 
    { 
     v.getBackground().clearColorFilter();   
    }  
} 

NumberAdapter.java :

public class NumberAdapter extends BaseAdapter { 
private Context context; 
private int min_num; 
private int max_num;  

public NumberAdapter(Context c, int num1, int num2) { 
    this.context = c;   
    this.min_num = num1; 
    this.max_num = num2; 

    total_num = max_num - min_num + 1;  
}  

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

    TextView textView; 

    if(convertView == null) 
    { 
     textView = new TextView(context); 
     textView.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, 85)); 
     textView.setTextSize(18.0f); 
     textView.setGravity(0x11); 
    } 
    else 
    { 
     textView = (TextView) convertView; 
    }  

    textView.setText(Integer.toString(position)); 
    textView.setBackgroundResource(R.drawable.number_deselect); 

    return textView; 
} 

public int getCount() { 
    return total_num; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return position; 
} 

}

답변

1

나는이 thread에 내 대답에 감사를 발견했다. 기본적으로 GridView가 완료된 후에 addOnGlobalLayoutListener를 만들고 getChildAt를 호출해야합니다. 너무 일찍 호출하면 null이 반환됩니다.

ViewTreeObserver vto = tv.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     TextView textView = (TextView) gridView.getChildAt(i); 
     textView.getBackground().setColorFilter(Color.rgb(210, 230, 230), PorterDuff.Mode.MULTIPLY); 
    } 
}); 
관련 문제