2012-05-07 1 views
1

안드로이드에서 다음과 같은 문제에 접근하는 최선의 방법을 찾으려고 노력 중입니다.안드로이드 - 어댑터 백업 데이터가있는 마법사 유형 활동

콘텐츠 공급자로부터 데이터가 Question 개체의 배열 형식으로 제공됩니다. Question 객체에는 텍스트와 ID가 있습니다. 각 질문에는 4 개의 답변이 있으며, 나머지는 QuestionResponse 개체의 나머지 서버로 보내집니다.

ID는보기에서 한 번에 하나씩 표시됩니다 (사용자가 질문을 읽고 답변을 선택한 다음 "다음"을 누르면 새 질문의 다음 질문으로 이동합니다).하지만이 작업을 수행해야합니다. ListView는 콘텐츠 관찰자를 등록하는 측면에서 마찬가지입니다 (질문은 서버에서 변경 될 수 있으며 콘텐츠 공급자에서 변경 될 수 있습니다). 콘텐츠 공급자에 저장된 데이터의 변경 사항은 화면이 나타납니다.

내가 필요로하는 것은 SimpleCursorAdaptor와 같은 것이지만 뷰가 목록보기가되는 대신 뷰가 커서가 가리키는 행 중 하나의 전체 화면으로 표시되어야합니다. 필자는 내 자신의 어댑터를 만들려고 시도했지만, 다음에 갈 곳이 무엇인지에 대해서는 조금 고심하고 있습니다. 여기 내 어댑터가 ....

public class QuestionAdapter implements Adapter { 


public ArrayList<Question> questions = new ArrayList<Question>(); 
private Context context ; 


public QuestionAdapter(ArrayList<Question> questions, Context context) 
{ 
    this.questions.clear(); 
    this.questions.addAll(questions); 
    this.context = context; 
} 

public void updateQuestions(ArrayList<Question> questions) 
{ 
    questions.clear(); 
    questions.addAll(questions); 
} 

@Override 
public int getCount() { 
    return questions.size(); 
} 

@Override 
public Object getItem(int arg0) { 
    // TODO Auto-generated method stub 
    return questions.get(arg0); 
} 

@Override 
public long getItemId(int arg0) { 
    // TODO Auto-generated method stub 
    return Long.parseLong(questions.get(arg0).get_id()); 
} 

@Override 
public int getItemViewType(int arg0) { 
    // TODO Auto-generated method stub 
    return IGNORE_ITEM_VIEW_TYPE; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View questionView = inflater.inflate(R.layout.question, parent); 
    return questionView; 
} 

@Override 
public int getViewTypeCount() { 
    return 1; 
} 

@Override 
public boolean hasStableIds() { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean isEmpty() { 
    // TODO Auto-generated method stub 
    return questions.isEmpty(); 
} 

@Override 
public void registerDataSetObserver(DataSetObserver arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void unregisterDataSetObserver(DataSetObserver arg0) { 
    // TODO Auto-generated method stub 

} 
} 

그리고 내 view.xml은 여기 있습니다.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/questionText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="20dp" 
    android:layout_weight="0.27" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TableLayout 
    android:id="@+id/tableLayout1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="20dp" > 

    <TableRow 
     android:id="@+id/tableRow1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <ToggleButton 
      android:id="@+id/passButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textOn="Pass" 
      android:textOff="Pass" /> 

     <ToggleButton 
      android:id="@+id/advisoryButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textOn="Advisory" 
      android:textOff="Advisory" /> 

     <ToggleButton 
      android:id="@+id/defectButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textOn="Defect" 
      android:textOff="Defect"/> 

     <ToggleButton 
      android:id="@+id/naButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textOn="N/A" 
      android:textOff="N/A" /> 

    </TableRow> 

</TableLayout> 

<Button 
    android:id="@+id/next" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right" 
    android:text="Next..." /> 

</LinearLayout> 

답변

1

무엇이 효과가 있을지에 대해 잘 알고있는 추측이 있습니다.

리스트 뷰와 같이 쉽게 바인딩 할 수있는 다른 뷰가 있는지 확신 할 수 없으므로 목록 뷰를 사용하여 예제를 수정 해 보겠습니다. 첫째, Listview 자체를 fill_parent로 만들고 자식 항목을 listview Fill_parent 내에 만들면 기본적으로 하나의 하위 항목 만 표시 할 수있는 listview가 생성됩니다.

알터 getCount

내가 getCount(...)은 많은 데이터 행을 표시하는 방법을 결정하는 데 사용됩니다 생각 : 그럼 당신은 다음을 시도 할 수 있습니다. 일반적으로이 세트를 우리가 사용하고있는 ArrayList의 수/크기로 설정합니다. 귀하의 경우에는 한 번에 하나의 질문 만 표시되기를 원하기 때문에 1로 설정하는 것이 좋습니다.

질문 당신은 표시 할 질문을 알 수 있도록 당신이 현재 어떤 질문에 대한 추적을 만들어야합니다

에 대한 추적을 만듭니다. 이를 위해 간단한 int questionTracker 변수가 필요합니다.이 변수는 매번 응답/통과/건너 뛸 때마다 증가 할 수 있습니다.

수정의 getView (...)는 기반으로합니다 올바른 질문으로 화면을 채우는 데 필요합니다, 올바른 상담자의 getView (...) 호출에서

를 표시합니다 귀하의 추적기. 이

@Override public View getView(int position, View convertView, ViewGroup parent) 
{  
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    View questionView = inflater.inflate(R.layout.question, parent);  

    //Get the next question 
    Question currentQuestion = questions.get(questionTracker); 

    //Fill the fields in the inflated layout with the data from the Question object 
    TextView questionField = questionView.findViewById(R.id.questionText) 
    questionField.setText(Question.question); 

    return questionView; 
} 

강제 질문처럼 뭔가 당신이 qestion 대답/통과/다음 명중 한 후에 까다로운 부분은 그리기를 다시보기를 강요한다

변경합니다. 필자는 한번도 getView (...)를 수동으로 호출 할 수는 있을지 모르므로 잘 모르겠습니다.

+0

ListView.getCount()를 변경하는 것에 대해 잘 모르겠습니다. 얼마나 많은 행을 표시할지 결정하지 않습니다 .... ?? 그것은 단지 당신에게 어댑터가 얼마나 많은 행을 가지고 있는지를 알려줍니다. – GPGVM

+0

나는 getCount (...)는 데이터 집합에있는 항목 수를 나타내며 전달시 전달해야 할 행/항목의 수를 어댑터에 나타냅니다. getCount (...) 결과를 1로 설정하면 데이터 세트에 하나의 값/행/항목 만 있다고 생각하기 때문에 하나의 행을 그리려고합니다. 나는 이것을 직접 시험해야 할 것이다. 나는 아주 잘못 될 수있다, 나는 단지 어댑터가 내부적으로 getCount (...)를 사용하여 getView (...)를 호출하는 횟수를 결정할 것이라고 생각했다. – Gophermofur

+0

예. 내가 사용하는 SimpleAdapter를 확장 한 다음 GetCount를 반환하여 1을 반환합니다. 매력처럼 작동합니다. 몇 가지 이유로 지금 내 행이 전체 화면을 채우지 못하는 이유를 찾아야합니다. – GPGVM