1

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

我有来自问题对象数组形式的内容提供者的数据。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>
4

1 回答 1

1

这是对可能起作用的有根据的猜测。

我不确定是否还有其他易于绑定到列表视图的视图,因此我将尝试修改您的示例以使用列表视图。首先,如果您将 Listview 本身设为 fill_parent 并将子项设置在 listview Fill_parent 中,那么您基本上会得到一个只能显示一个子项的列表视图。然后您可以尝试以下操作:

改变 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(...),尽管我从未这样做过,所以我不确定。

于 2012-05-07T14:23:50.927 回答