Android - 具有适配器支持数据的向导类型活动

时间:2012-05-07 14:04:51

标签: android android-layout android-contentprovider

我正试图找出解决Android问题的最佳方法。

我以一系列Question对象的形式来自内容提供者。 Question对象有一些文本和id。每个问题有4个答案,将在QuestionResponse对象中发送回休息服务器。

我喜欢在视图中一次显示一个问题(用户阅读问题,选择答案,然后点击“下一步”,这将移动到新屏幕上的下一个问题)但我需要在与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

}
}

这是我的观点question.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 个答案:

答案 0 :(得分:1)

这是一个有根据的猜测,可能有用。

我不确定是否有其他视图很容易绑定到listview,因此我将尝试修改您的示例以使用listview。首先,如果你将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; 
} 

强制更改问题

在你点击下一个/传递/回答问题之后,棘手的部分将强制视图重新绘制。你可以手动调用getView(...),虽然我从来没有这样做过,所以我不确定。