Не понимает пользовательский адаптер курсора - PullRequest
1 голос
/ 21 февраля 2012

Для моего приложения я использую список просмотра пары.До сих пор использовался simplecursoradapter, и он прекрасно работает, за исключением моего представления списка, в котором есть TextView и EditText в строке.Я столкнулся с проблемами, с которыми сталкивались другие, например, извлекал данные из текста редактирования для использования в другом упражнении, а также при прокрутке текста переходил в разные поля из-за повторного использования.После того, как исследование кажется наилучшим способом преодоления, это создать специальный адаптер курсора, но я не могу понять, как это сделать.

public void fillData() {
    Cursor e = mydbhelper.getUserWord();
        startManagingCursor(e);
        String[] from = new String[] {dbadapter.KEY_USERWORD,};
        int[] to = new int[] {R.id.textType,};
       editadapter = new SimpleCursorAdapter(this, R.layout.edit_row, e, from, to);
       ListView list = getListView();
       View footer = getLayoutInflater().inflate(R.layout.footer_layout, list, false);
       list.addFooterView(footer);
       setListAdapter(editadapter);

Это то, что я использую для рассматриваемого действия, но я не могу понять, как это могло бы заполнить пользовательский адаптер курсора.

Также не уверен, должен ли этот пользовательский адаптер находиться в отдельном классе от остальной части моего кода (например, мои пункты меню, валидатор edittext, события onclick и т. Д.), И вызывать пользовательский в начале класса длявсе остальное.

РЕДАКТИРОВАТЬ Был в состоянии выяснить, что мне нужно от http://www.vogella.de/articles/AndroidListView/article.html#overview

Не знаю, как я не столкнулся с этим ранее, но это помогло мне построитьбаза для работы.TY за всю помощь.Я чувствую, что у меня есть ALOT лучше понять, как работают пользовательские адаптеры курсора.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2012

Попробуйте пользовательский адаптер вместо пользовательского курсора ...

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addnew);

    ItemsAdapter itemsAdapter = 
        new ItemsAdapter(AddNew.this, R.layout.addnew_typelist_row, types);

    listtype.setAdapter(itemsAdapter);
}

public class ItemsAdapter extends BaseAdapter {
    ArrayList<String> items = new ArrayList<String>();
    String type;
    int color;
    ViewHolder holder;
    Context context;
    int resID;

    public ItemsAdapter(Context context, int resID, ArrayList<String> items) {
        this.items = items;
        this.context = context;
        this.resID=resID;
    }

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

        View v = convertView; 
        TextView name = null ;

        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            v = inflater.inflate(resID, null);

            holder=new ViewHolder();
            holder.lt = (RelativeLayout)v.findViewById(R.id.ltlistrow);
            holder.name = (TextView)v.findViewById(R.id.desc);

            v.setTag(holder);

        } else {
            holder = (ViewHolder)v.getTag();
            v = convertView;
        }

        String nam = items.get(position);
        if (nam != null) {
            holder.name.setText(items.get(position));
        }

        return v;
    }

    public static class ViewHolder{
        TextView name;
        RelativeLayout lt ;
    }
}

Пользовательский адаптер может быть в новом классе или может быть внутренним классом. надуйте макет с текстом редактирования и установите его как элемент списка в getView. надеюсь, это поможет

0 голосов
/ 21 февраля 2012

Для

Also not sure if this custom adapter should be in a separate class from the rest of my       code (like my menu items, edittext validator, onclick events etc.) and call the custom at the start of the class for everything else.

Да, это должно быть в отдельном классе.

В вашей деятельности

ListView lv = (ListView)findViewById(R.id.list);

Cursor c = getFromDb();
CustomCursorAdapter adapter = new CustomCursorAdapter(getApplicationContext() , c);
lv.setAdapter(adapter);

Теперь создайте CustomCursorAdapter

public class CustomCursorAdapter extends CursorAdapter {

public CustomCursorAdapter(Context context , Cursor c) {
    super(context,c);

    // TODO Auto-generated constructor stub
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    // TODO Auto-generated method stub

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub

             //Inflate your layout with textview and edittext
             //setText with values from cursor
             //return the view

    return null;
}

}
0 голосов
/ 21 февраля 2012

Создать и использовать Custom Cursor Adapter очень просто, просто расширьте класс CursorAdapter в класс, но, как и в действии, в котором вы уже расширили класс, вы не можете расширить CursorAdapter в классе активности, поэтому вам нужно создать новый класс, но вы может создать частный класс в вашем классе деятельности, поэтому он может использовать поля вашего класса деятельности. Например, CustomCursorAdapter. Класс CursorAdapter имеет различные методы init, которые вы можете расширить для достижения своей цели. Например, чтобы изменить представления вашего адаптера, в соответствии с вашими требованиями, переопределить newView () и bindView (), newView - это создание нового представления (раздувание из xml или создание новых объектов), а bindView () - привязка некоторых значения для существующих представлений. см. пример:

public class ExampleCursorAdapter extends CursorAdapter {
    public ExampleCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView summary = (TextView)view.findViewById(R.id.summary);
        summary.setText(cursor.getString(
                cursor.getColumnIndex(ExampleDB.KEY_EXAMPLE_SUMMARY)));
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.item, parent, false);
        bindView(v, context, cursor);
        return v;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...