2016-12-15 1 views
0

Я сейчас создаю свое первое приложение для Android и надеюсь, что вы можете мне немного помочь.ListView вложен в ListView и другую строку в зависимости от значения курсора

Я хочу создать контрольные листы с различными типами ответов (радио, флажок или просто открыть), теперь я знаю, что мне нужно задать ListView вопросов, а также вложенные ListView ответов на каждый вопрос.

Я попытался сделать пользовательский CursorAdapter, который будет реализовывать разный XML-макет строки в зависимости от значения курсора, не работает для меня: /, но это только часть проблемы, поскольку я до сих пор не знаю, как извлекать данные из другой таблицы (ответы) внутри курсора (вопросов).

Любые предложения? Ниже код, который я написал для разных XML-файлов для строк (не работает).

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    if (cursor.getInt(cursor.getColumnIndex(KEY_ID)) <= 3) { 
     return cursorInflater.inflate(R.layout.display_name_row, parent, false); 
    } else { 
     return cursorInflater.inflate(R.layout.display_user_row, parent, false); 
    } 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView textViewTitle = (TextView) view.findViewById(R.id.r_lv_name); 
    TextView textViewTitle2 = (TextView) view.findViewById(R.id.r_lv_u_name); 
    TextView textViewTitle3 = (TextView) view.findViewById(R.id.r_lv_u_surname); 

    if (cursor.getInt(cursor.getColumnIndex(KEY_ID)) <= 3) { 

     String title = cursor.getString(cursor.getColumnIndex(CS_KEY_NAME)); 
     textViewTitle.setText(title); 
    } else { 

     String title = cursor.getString(cursor.getColumnIndex(CS_KEY_NAME)); 
     textViewTitle2.setText(title); 

    } 
} 

Редактировать 1 - Функция заполнения дочернего ребра в зависимости от результата БД - как?

public void fillQuestions(int id) { 
    Cursor questionsCursor = db.getQuestions(id); 
    EventActivity.this.startManagingCursor(questionsCursor); 
    questionsCursor.moveToFirst(); 

    ExpandableListView questionsList = (ExpandableListView) findViewById(R.id.elv_questions); 

    ExpandableQuestionsAdapter adapter = new ExpandableQuestionsAdapter(
      questionsCursor, 
      EventActivity.this, 
      R.layout.display_name_row, 
      R.layout.display_cb_answer_row, 
      new String[] {"questionText"}, 
      new int[] {R.id.r_lv_name}, 
      new String[] {"answerName"}, 
      new int[] {R.id.r_lv_cb_name, R.id.r_lv_name}); 

    questionsList.setAdapter(adapter); 
    for(int i=0; i < adapter.getGroupCount(); i++) { 
     questionsList.expandGroup(i); 
    } 

} 

public class ExpandableQuestionsAdapter extends SimpleCursorTreeAdapter { 

    @Override 
    public int getChildTypeCount() { 
     return 2; 
    } 

    @Override 
    public int getChildType(int groupPosition, int childPosition) 
    { 
     int result = 0; 
     if (childPosition == getChildrenCount(groupPosition) - 1) 
      result = 1; 

     return result; 
    } 


    public ExpandableQuestionsAdapter(Cursor cursor, Context context, int groupLayout, 
             int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom, 
             int[] childrenTo) { 
     super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom, childrenTo); 
    } 

    @Override 
    protected Cursor getChildrenCursor(Cursor groupCursor) { 
     Cursor childCursor = db.getAnswers(groupCursor.getInt(groupCursor.getColumnIndex(KEY_F_ID))); 
     EventActivity.this.startManagingCursor(childCursor); 
     childCursor.moveToFirst(); 
     return childCursor; 

    } 

    @Override 
    protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) { 
     String test = cursor.getString(cursor.getColumnIndex("questionText")); 
     Log.d("Cursor", test); 
     super.bindGroupView(view, context, cursor, isExpanded); 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     TextView textView = null; 
     if (convertView == null) { 

      LayoutInflater inflater = (LayoutInflater)getSystemService((getBaseContext().LAYOUT_INFLATER_SERVICE)); 
      int itemType = getChildType(groupPosition, childPosition); 

      switch (itemType) { 
       case 0: 
        convertView = inflater.inflate(R.layout.display_cb_answer_row, null); 
        break; 
       case 1: 
        convertView = inflater.inflate(R.layout.display_name_row, null); 
        break; 
      } 
     } 

     textView = (TextView)convertView.findViewById(R.id.r_lv_name); 
     textView.setText("Hello"); 
     return convertView; 
    } 

    @Override 
    protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) { 
     super.bindChildView(view, context, cursor, isLastChild); 
    } 
} 
+1

Попробуйте использовать 'ExpandableListView'. – Asym

ответ

1

Вложенный списокView не является решением. Использование

ExpandableListView: http://www.androidhive.info/2013/07/android-expandable-list-view-tutorial/

или

создать программно в LinearLayout: https://stackoverflow.com/a/5983743/2949782

+0

ExpendableListView звучит очень хорошо, но я до сих пор не знаю, как заполнять дочерние элементы различными макетами в зависимости от БД. Посмотрите на редактирование – sziszu

+0

в 'getChildView', перед' .inflate (R.layout.list_item, null); ', вызовите' getChildType' для оценки типа данных из БД, затем раздуйте разный макет. См. Http://stackoverflow.com/a/12286542/2949782 –

+0

Хорошо, я немного изменил это, но до сих пор не знаю, как передать childType с помощью курсора, а также не привязывает данные к детям сейчас - см. Edit 1 – sziszu

Смежные вопросы