Урок 136. CursorLoader

Обсуждение уроков
speedy
Сообщения: 2
Зарегистрирован: 18 сен 2015, 23:50

Re: Урок 136. CursorLoader

Сообщение speedy » 19 сен 2015, 00:03

Новички. Столкнулись с такой проблемой. Используем SimpleCursorAdapter и CursorLoader. В какой-то момент, при удалении элемента из списка пропадает весь список. Происходит это нерегулярно. Отследить не можем. Код даю.

Код: Выделить всё

			  /* работа на второй странице*/

            itog=(float) 0;
            prodid = 0;
            view = inflater.inflate(R.layout.fproducts, null);
            acPN = (AutoCompleteTextView ) view.findViewById(R.id.acPN);
            acPE = (AutoCompleteTextView ) view.findViewById(R.id.acPE);
            etSName= (EditText) view.findViewById(R.id.etSName);
            // etSName.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
            etCount = (EditText) view.findViewById(R.id.etCount);
            etPrice = (EditText) view.findViewById(R.id.etPrice);
            chbvagno = (CheckBox) view.findViewById(R.id.chbvagno);
            tvItog = (TextView) view.findViewById(R.id.tvItog);
            tvItogtxt = (TextView) view.findViewById(R.id.tvItogtxt);
            etCount.setVisibility(View.GONE);
            etPrice.setVisibility(View.GONE);
            chbvagno.setVisibility(View.GONE);
            acPE.setVisibility(View.GONE);
            lvData = (ListView) view.findViewById(R.id.lvData);
            CreateListProducts();
            CreateSPList ();
            FindMaxSP();
            getCursor(sn);
            tvItog.setText(String.format("%.2f",itog));
            ControlFonts();

            acPE.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    CreateListEdin();
                    return false;
                }
            });

            //процедура нажатия на EditText, изменение фокуса
            etSName.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    etSName.clearFocus();
                    etSName.setFocusable(true);
                    etSName.setFocusableInTouchMode(true);
                    return false;
                }
            });

            //процедура проверки sn при изменении фокуса
            etSName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    // TODO Auto-generated method stub
                    ControlSN();
                    String strName = etSName.getText().toString();
                    db.UpDateNSp(DB_STABLE, strName ,sn);
                    getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
                }
            });

            //процедура изменения названия списка
            etSName.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    // TODO Auto-generated method stub
                    if((event.getAction() == KeyEvent.ACTION_DOWN )&&
                            (keyCode == KeyEvent.KEYCODE_TAB ||
                                    keyCode == KeyEvent.KEYCODE_ENTER))
                    {
                        // сохраняем текст, введенный до нажатия Enter в переменную
                        String strName = etSName.getText().toString();
                        db.UpDateNSp(DB_STABLE, strName ,sn);
                        getActivity().getSupportLoaderManager().getLoader(0).forceLoad();
                        etSName.setFocusable(false);
                        etSName.setFocusableInTouchMode(false);
                        return true;
                    }
                    return false;
                }
            });

            //процедура долгого нажатия на строку в ListView
            lvData.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent,
                                               View view, final int position, long id) {
                    // TODO Auto-generated method stub
                    TextView textView1 = (TextView) view.findViewById(R.id.tvPN);
                    //проверяем, если продукт в корзине, то долгое нажатие не сработает пока не выкинем с корзины
                    if ((textView1.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == 0)
                    {
                        prodid = (int) id;
                        float tv2 = 0;
                        String tv3 = "";
                        float tv4 = 0;
                        int tv7=0;
                        lvData.setClickable(false);
                        etCount.setVisibility(View.VISIBLE);
                        acPE.setVisibility(View.VISIBLE);
                        etPrice.setVisibility(View.VISIBLE);
                        chbvagno.setVisibility(View.VISIBLE);
                        btDel.setVisibility(View.VISIBLE);
                        btSave.setVisibility(View.VISIBLE);
                        TextView textView2 = (TextView) view.findViewById(R.id.tvPK);
                        TextView textView3 = (TextView) view.findViewById(R.id.tvPE);
                        TextView textView4 = (TextView) view.findViewById(R.id.tvPP);
                        if ((textView2.getText().toString().length()==0) ||
                                (textView3.getText().toString().length()==0) ||
                                (textView4.getText().toString().length()==0) )
                        {
                            cursor = db.getSpisok2(prodid);
                            if (cursor.getCount() != 0) {
                                cursor.moveToFirst();
                                do {
                                    tv2 = Float.parseFloat(cursor.getString(cursor.getColumnIndex("skol")).replace(',', '.'));
                                    tv3 = cursor.getString(cursor.getColumnIndex("ename"));
                                    tv4 = Float.parseFloat(cursor.getString(cursor.getColumnIndex("sprice")).replace(',', '.'));
                                    tv7 = Integer.parseInt(cursor.getString(cursor.getColumnIndex("svagno")));
                                } while (cursor.moveToNext());
                            }
                            cursor.close();
                        }
                        acPN.setText(textView1.getText().toString());
                        if (textView2.getText().toString().length()==0)
                            etCount.setText(Float.toString(tv2));
                        else
                            etCount.setText(textView2.getText().toString());
                        if (textView3.getText().toString().length()==0)
                            acPE.setText(tv3);
                        else
                            acPE.setText(textView3.getText().toString());
                        if ((textView2.getText().toString().length()==0) ||
                                (textView4.getText().toString().length()==0) )
                            etPrice.setText(Float.toString(tv4));
                        else {
                            Float tv5 = Float.parseFloat(textView4.getText().toString().replace(',', '.'));
                            Float tv6 = Float.parseFloat(textView2.getText().toString().replace(',', '.'));
                            Float tv56 =round(tv5/tv6,2);
                            etPrice.setText(Float.toString(tv56));
                        }
                        ImageView imageView1 = (ImageView) view.findViewById(R.id.ivV);
                        if (imageView1.getVisibility()==View.VISIBLE)
                            chbvagno.setChecked(true);
                        else {
                            if (tv7==1)
                                chbvagno.setChecked(true);
                            else
                                chbvagno.setChecked(false);
                        }
                        etCount.requestFocus();
                    }
                    return true;
                }
            });

            //присвоение и обработка кнопки "Добавить продукт к списку"
            btnAdd = (Button) view.findViewById(R.id.btnAdd);
            btnAdd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (acPN.length() == 0)
                        Toast.makeText(getActivity(), "Введите продукт!", Toast.LENGTH_LONG).show();
                    else if (etCount.length() == 0)
                        Toast.makeText(getActivity(), "Введите количество продукта", Toast.LENGTH_LONG).show();
                    else if (acPE.length() == 0)
                        Toast.makeText(getActivity(), "Введите единицу продукта", Toast.LENGTH_LONG).show();
                    else if (etPrice.length() == 0)
                        Toast.makeText(getActivity(), "Введите цену продукта", Toast.LENGTH_LONG).show();
                    else {
                        if ((Float.parseFloat(etCount.getText().toString()) <= 0) ||
                                (Float.parseFloat(etPrice.getText().toString()) <= 0) )
                            Toast.makeText(getActivity(), "Количество и цена должны быть больше нуля", Toast.LENGTH_LONG).show();
                        else
                        {
                            ControlSN();
                            addProdInSpisok();
                            acPN.showDropDown();
                            GetNastr(sn);
                            CreateSPList();
                            etSName.setFocusable(false);
                            etSName.setFocusableInTouchMode(false);
                            SumInKorz(sn);
                        }
                    }
                }
            });

            //присвоение и обработка кнопки "Удалить продукт с списка"
            btDel = (Button) view.findViewById(R.id.btDel);
            btDel.setVisibility(View.GONE);
            btDel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ClView();
                    SumInKorz(prodid);
                    db.delRecPS(DB_STABLE,prodid);
                    lvData = (ListView) getActivity().findViewById(R.id.lvData);
                    getActivity().getSupportLoaderManager().getLoader(1).forceLoad();
                    lvData.setClickable(true);
                    etCount.setVisibility(View.GONE);
                    acPE.setVisibility(View.GONE);
                    etPrice.setVisibility(View.GONE);
                    chbvagno.setVisibility(View.GONE);
                    btDel.setVisibility(View.GONE);
                    btSave.setVisibility(View.GONE);
                }
            });

            //присвоение и обработка кнопки "Сохранить продукт в списке"
            btSave = (Button) view.findViewById(R.id.btSave);
            btSave.setVisibility(View.GONE);
            btSave.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (acPN.length() == 0)
                        Toast.makeText(getActivity(), "Введите продукт!", Toast.LENGTH_LONG).show();
                    else if (etCount.length() == 0)
                        Toast.makeText(getActivity(), "Введите количество продукта", Toast.LENGTH_LONG).show();
                    else if (acPE.length() == 0)
                        Toast.makeText(getActivity(), "Введите единицу продукта", Toast.LENGTH_LONG).show();
                    else if (etPrice.length() == 0)
                        Toast.makeText(getActivity(), "Введите цену продукта", Toast.LENGTH_LONG).show();
                    else {
                        if ((Float.parseFloat(etCount.getText().toString()) <= 0) ||
                                (Float.parseFloat(etPrice.getText().toString()) <= 0) )
                            Toast.makeText(getActivity(), "Количество и цена должны быть больше нуля", Toast.LENGTH_LONG).show();
                        else
                        {
                            UpdateProdInSpisok(prodid);
                            getActivity().getSupportLoaderManager().getLoader(1).forceLoad();
                            ClView();
                            lvData.setClickable(true);
                            etCount.setVisibility(View.GONE);
                            acPE.setVisibility(View.GONE);
                            etPrice.setVisibility(View.GONE);
                            chbvagno.setVisibility(View.GONE);
                            btDel.setVisibility(View.GONE);
                            btSave.setVisibility(View.GONE);
                            SumInKorz(prodid);
                        }
                    }
                }
            });

        }
        else if(pageNumber == 2) {
  			

}
xml.

Код: Выделить всё

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

	 <!-- 
    --> 
    
   	<LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:layout_gravity="center"
	    android:layout_weight="0.4">

		<ImageView
		    android:id="@+id/ivP"
	    	android:layout_width="3sp"
            android:layout_marginTop="3sp"
            android:layout_marginBottom="3sp"
	    	android:layout_height="match_parent">
		</ImageView>

		  <ImageView
		    android:id="@+id/ivKorz"
	    	android:layout_width="wrap_content"
	    	android:layout_height="wrap_content"
	    	android:layout_marginLeft="5sp"
	    	android:layout_gravity="center_vertical">
		  </ImageView>
	
		<TextView
	    	android:id="@+id/tvPN"
	    	android:layout_width="wrap_content"
	    	android:layout_height="wrap_content"
	    	android:layout_marginLeft="5sp"
            android:layout_marginTop="15sp"
            android:layout_marginBottom="15sp"
	    	android:layout_gravity="center_vertical"
	    	android:textSize="20sp">
		</TextView>
        <ImageView
            android:id="@+id/ivV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:src="@drawable/important"
            android:layout_marginLeft="10sp"
            android:layout_gravity="center_vertical">
        </ImageView>

	</LinearLayout>

	
	<LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:gravity="left"
	    android:layout_gravity="center_vertical"
	    android:layout_weight="0.8"
	    android:orientation="vertical" >
	    
	    <LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:gravity="right"
	    android:orientation="horizontal" >
 		
 			<TextView
		 		android:id="@+id/tvPK"
 				android:layout_width="wrap_content"
 				android:layout_height="wrap_content"
 				android:textSize="10sp">
			</TextView>
	        
		    <TextView
	 			android:id="@+id/tvPE"
 				android:layout_width="wrap_content"
 				android:layout_height="wrap_content"
 				android:layout_marginLeft="5sp"
 				android:textSize="10sp">
			</TextView>
		
 		</LinearLayout>
 		
	   <LinearLayout
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:gravity="right"
	    android:orientation="horizontal" >
		
  			<TextView
	 		    android:id="@+id/tvPV"
 		    	android:layout_width="wrap_content"
 		    	android:layout_height="wrap_content"
 		    	android:textSize="10sp" >
			</TextView>	       
	    
	        <TextView
 		    	android:id="@+id/tvPP"
 		    	android:layout_width="wrap_content"
 		    	android:layout_height="wrap_content"
 		    	android:layout_marginLeft="3sp"
 		    	android:textSize="20sp"
 		    	android:textColor="#000000">
			</TextView>
		
		</LinearLayout>
			
	</LinearLayout>
		
</LinearLayout>

speedy
Сообщения: 2
Зарегистрирован: 18 сен 2015, 23:50

Re: Урок 136. CursorLoader

Сообщение speedy » 25 сен 2015, 00:09

все, ребята. Разобрались сами. Надеюсь в поисковиках тема светится и мы сможем помочь кому-то еще, если такая проблема вылезет.

Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 136. CursorLoader

Сообщение BiK-14 » 25 сен 2015, 15:00

Сам только недавно начал заниматься андроид программированием, прошу помочь разобраться с работой getSupportLoaderManager(), я пытаюсь отдать заполнение ЛистВью фрагменту, через getActivity сделать это не получается, т.к. само Активити (контейнер) унаследовано от AppCompatActivity. Можно как то сделать по другому?

Вот листинг MainActivity

Код: Выделить всё

package ru.appchief.applications.workoutnote;

import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import ru.appchief.applications.workoutnote.Fragments.Exercises;
import ru.appchief.applications.workoutnote.Fragments.Programs;
import ru.appchief.applications.workoutnote.Fragments.SplashScreen;

public class MainActivity extends AppCompatActivity {
    FragmentManager fragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragmentManager = getFragmentManager();

        Exercises exercises = new Exercises();
        fragmentManager.beginTransaction()
                .replace(R.id.container, exercises)
                .addToBackStack(null)
                .commit();

        runSplash();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void runSplash(){
        SplashScreen splashScreen = new SplashScreen();
        fragmentManager.beginTransaction()
                .replace(R.id.container, splashScreen)
                .addToBackStack(null)
                .commit();
    }
}

А вот Fragment'а (48 строка):

Код: Выделить всё

package ru.appchief.applications.workoutnote.Fragments;

import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import ru.appchief.applications.workoutnote.DB;
import ru.appchief.applications.workoutnote.R;

public class Exercises extends Fragment implements LoaderCallbacks<Cursor> {
    ListView lvTest;
    DB db;
    SimpleCursorAdapter scAdapter;
    Cursor cursor;

    public Exercises() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_exercises, container, false);

        lvTest = (ListView) v.findViewById(R.id.listView);
        db = new DB(getActivity());
        db.open();
        cursor = db.getData("exercisestab", new String[] {"title"}, null, null, null, null,null);
        scAdapter = new SimpleCursorAdapter(getActivity(), R.id.itemLV, cursor, new String[] {"title"}, new int[] {R.id.itemLV}, 0);
        lvTest.setAdapter(scAdapter);

        //Проблема тут:
        getSupportLoaderManager().initLoader(0, null, this);

        return v;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        db.close();
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new MyCursorLoader(getActivity(), db);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        scAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

    static class MyCursorLoader extends CursorLoader {
        DB db;

        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }

        public Cursor loadInBackground() {
            Cursor cursor = db.getData("exercisestab", null, null, null, null, null,null);
            return cursor;
        }
    }
}



Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 136. CursorLoader

Сообщение BiK-14 » 29 сен 2015, 14:15

В связи с тем, что активность тут практически нулевая, пытаюсь сам разрешить проблему. Если же все таки меня кто то слышит, очень прошу направить меня на верное русло, может я ерундой занимаюсь)).
В общем, создал класс унаследованный от FragmentActivity и имплементировал ему ЛоадерКэллБэк, все грузится без ошибок, но в итоге ЛистВью не заполнен. Вот листинг:

ListLoader.java, отвечает за заполнение переданного View (думаю тут реализация не правильная, но не могу понять почему):

Код: Выделить всё

package ru.appchief.applications.workoutnote;

import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.widget.ListView;

public class AdapterCursorLoader extends FragmentActivity implements LoaderCallbacks<Cursor> {
    Context mCtx;
    SimpleCursorAdapter scAdapter;
    DB mDb;
    Cursor mCursor;
    ListView mListView;

    public AdapterCursorLoader(Context ctx, DB db, Cursor cursor, ListView listView) {
        mCtx = ctx;
        mDb = db;
        mCursor = cursor;
        mListView = listView;
    }

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        scAdapter = new SimpleCursorAdapter(this, R.id.listView, mCursor, new String[]{"title"}, new int[]{R.id.textView}, 0);
        mListView.setAdapter(scAdapter);
        getSupportLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new MyCursorLoader(mCtx, mDb);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        scAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

    static class MyCursorLoader extends CursorLoader {
        DB db;

        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }

        public Cursor loadInBackground() {
            Cursor cursor = db.getData("exercisestab", null, null, null, null, null, null);
            return cursor;
        }
    }
}
Фрагмент, в котором запрашивается Курсор в БД и передается спец. созданный класс:

Код: Выделить всё

package ru.appchief.applications.workoutnote.Fragments;

import android.database.Cursor;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import ru.appchief.applications.workoutnote.AdapterCursorLoader;
import ru.appchief.applications.workoutnote.DB;
import ru.appchief.applications.workoutnote.R;

public class Exercises extends Fragment {
    ListView lvTest;
    DB db;
    Cursor cursor;
    AdapterCursorLoader adapterCursorLoader;

    public Exercises() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_exercises, container, false);

        lvTest = (ListView) v.findViewById(R.id.listView);
        db = new DB(getActivity());
        db.open();
        cursor = db.getData("exercisestab", null, null, null, null, null,null);
        adapterCursorLoader = new AdapterCursorLoader(getActivity(), db, cursor, lvTest);

        return v;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        db.close();
    }
}
MainActivity.java:

Код: Выделить всё

package ru.appchief.applications.workoutnote;

import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import ru.appchief.applications.workoutnote.Fragments.Exercises;
import ru.appchief.applications.workoutnote.Fragments.Programs;
import ru.appchief.applications.workoutnote.Fragments.SplashScreen;

public class MainActivity extends AppCompatActivity {
    FragmentManager fragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragmentManager = getFragmentManager();

        Exercises exercises = new Exercises();
        fragmentManager.beginTransaction()
                .replace(R.id.container, exercises)
                .addToBackStack(null)
                .commit();

        runSplash();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void runSplash(){
        SplashScreen splashScreen = new SplashScreen();
        fragmentManager.beginTransaction()
                .replace(R.id.container, splashScreen)
                .addToBackStack(null)
                .commit();
    }
}
Есть подозрение что я занимаюсь изобретением велосипеда, к тому же прикручиваю костыли, но другого способа реализации не вижу (если не учитывать создания отдельного Activity).

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 29 сен 2015, 15:45

У тебя каша, ты класс активити назвал и адаптером и лоадером!от этого у тебя подмена понятий ты пытаешься из фрагмента какого-то создавать класс активити.
Тема уже обсосана.рекомендую вначале реализовать список в активити и убрать свой фрагмент, разобраться как следует, потом если надо реализовать все в фрагменте
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

element111
Сообщения: 1
Зарегистрирован: 29 сен 2015, 20:40

Re: Урок 136. CursorLoader

Сообщение element111 » 29 сен 2015, 21:22

// создааем адаптер и настраиваем список
scAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0);

подскажите пожалуйста, почему вместо курсора стоит null, и что за ноль в конце?(заранее извиняюсь за возможно глупые вопросы, я только учусь)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 29 сен 2015, 22:52

а ты на этом сайте developer.android.com никогда-никогда не был?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 136. CursorLoader

Сообщение BiK-14 » 30 сен 2015, 08:35

Foenix писал(а):У тебя каша, ты класс активити назвал и адаптером и лоадером!от этого у тебя подмена понятий ты пытаешься из фрагмента какого-то создавать класс активити.
Тема уже обсосана.рекомендую вначале реализовать список в активити и убрать свой фрагмент, разобраться как следует, потом если надо реализовать все в фрагменте
В активити все без проблем получается, а в фрагменте я путем различных способов пытался это реализовать, поэтому получилась каша, рассчитывал, что тут в нужном направлении отправят.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 30 сен 2015, 09:06

Реализация в активитии фрагменте одинаковая
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 136. CursorLoader

Сообщение BiK-14 » 30 сен 2015, 12:35

Foenix писал(а):Реализация в активитии фрагменте одинаковая
Прошу прощения, при импорте (import android.app.LoaderManager) а не (import android.support.v4.app.LoaderManager;) все заработало.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 30 сен 2015, 13:38

Абсолютно везде нужно юзать саппорт библиотеку, даже если это кажется ненужным. Во всех импортах всего проекта.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 136. CursorLoader

Сообщение BiK-14 » 30 сен 2015, 14:00

Foenix писал(а):Абсолютно везде нужно юзать саппорт библиотеку, даже если это кажется ненужным. Во всех импортах всего проекта.
Имеется ввиду android.support.v4.* ?
Почему если не секрет? Если это так необходимо то придется дальше ломать голову)

Попутно вопросик. Каким образом можно сделать заставку (фрагмент СплэшСкрин с TimeUnit, затем через 2 секунды - .popbackstack()), т.к. если я делаю заставку, то при возврате во фрагмент с ЛистВью ничего вообще не отображается, чистый лист. Я конечно разберусь и сам, просто времени больше займет.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 30 сен 2015, 16:09

Там разные есть v4 v7
Заставка с какой целью?
У листвью в xml параметр показывать что список пустой или грузится
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
BiK-14
Сообщения: 7
Зарегистрирован: 25 сен 2015, 14:35

Re: Урок 136. CursorLoader

Сообщение BiK-14 » 01 окт 2015, 07:33

Foenix писал(а):Там разные есть v4 v7
Заставка с какой целью?
У листвью в xml параметр показывать что список пустой или грузится
По v7 понял, спс.
Я сейчас особо никакой цели не преследую, только осваиваю java, далее уже буду писать полноценное приложение, т.к. постоянный поиск решений по простым вопросам только засирает код и в итоге все заново приходится переделывать.
А в листвью я включил параметр для отображения пустого списка (до того, как была заполненна БД и до сплеша он работал).

Глюк в том, что если убрать фрагмент с листвью, то сплеш отображается, если убрать сплеш, то листвью отображается, но никогда вместе).
Я чую что проблема в том, что я два фрагмента почти одновременно в один контейнер запихиваю, но пока не придумал как это реализовать, для наглядности привожу листинг:

MainActivity

Код: Выделить всё

public class MainActivity extends AppCompatActivity {
    FragmentManager fragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DB db = new DB(this);
        db.open();
        db.close();

        fragmentManager = getFragmentManager();

        Exercises exercises = new Exercises();
        fragmentManager.beginTransaction()
                .replace(R.id.container, exercises)
                .addToBackStack(null)
                .commit();

        runSplash();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void runSplash() {
        SplashScreen splashScreen = new SplashScreen();
        fragmentManager.beginTransaction()
                .replace(R.id.container, splashScreen)
                .addToBackStack(null)
                .commit();
    }
}
SplashScreen

Код: Выделить всё

public class SplashScreen extends Fragment {


    public SplashScreen() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        SplashTask splashTask = new SplashTask();
        splashTask.execute();

        return inflater.inflate(R.layout.fragment_splash_screen, container, false);
    }

    class SplashTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            getActivity().getFragmentManager().popBackStack();

            return null;
        }
    }
}
И второй фрагмент с листфью

Код: Выделить всё

public class Exercises extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>{
    DB db;
    Button btn;
    SimpleCursorAdapter scAdapter;


    public Exercises() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_exercises, container, false);
        db = new DB(getActivity());
        db.open();

        scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, new String[] {"title"}, new int[] {R.id.tvText}, 0);
        setListAdapter(scAdapter);
        getLoaderManager().initLoader(0, null, this);

        btn = (Button) v.findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Cursor cur = db.getData("exercisestab", null, null, null, null, null, null);
                cur.moveToFirst();
                Toast.makeText(getActivity(), cur.getString(cur.getColumnIndex("title")), Toast.LENGTH_LONG).show();
            }
        });

        return v;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        db.close();
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new MyCursorLoader(getActivity(), db);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        scAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

    static class MyCursorLoader extends CursorLoader {
        DB db;

        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }
        @Override
        public Cursor loadInBackground(){
            return db.getData("exercisestab", null, null, null, null, null, null);
        }
    }
}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 01 окт 2015, 12:26

Сплеш скрин плохой тон в дизайне, имей ввиду. Код некогда мне смотреть
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

vanfogel
Сообщения: 1
Зарегистрирован: 07 окт 2015, 13:04

Re: Урок 136. CursorLoader

Сообщение vanfogel » 07 окт 2015, 13:13

При попытке передать объект класса DataBaseLoader, наследуемый от CursorLoader в методе

Код: Выделить всё

@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        Log.d(LOG_TAG, "onCreateLoader for loader_id " + id);
        return new DataBaseCursorLoader(this, db, id);
    }
вылетает исключение

Код: Выделить всё

10-07 10:14:23.364  22062-22062/ru.konstantinsterkhov.urlmediaplayer D/myLogs﹕ onCreateLoader for loader_id -1
10-07 10:14:23.364  22062-22062/ru.konstantinsterkhov.urlmediaplayer D/AndroidRuntime﹕ Shutting down VM
10-07 10:14:23.364  22062-22062/ru.konstantinsterkhov.urlmediaplayer W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb4cd5908)
10-07 10:14:23.364  22062-22062/ru.konstantinsterkhov.urlmediaplayer E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.konstantinsterkhov.urlmediaplayer/ru.konstantinsterkhov.urlmediaplayer.StationChooseActivity}: java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inner member class: DataBaseCursorLoader{b506fa00 id=0}
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inner member class: DataBaseCursorLoader{b506fa00 id=0}
            at android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:264)
            at android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:765)
            at android.support.v4.app.FragmentHostCallback.doLoaderStart(FragmentHostCallback.java:207)
            at android.support.v4.app.FragmentController.doLoaderStart(FragmentController.java:337)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:513)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164)
            at android.app.Activity.performStart(Activity.java:5114)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
Текст класса DataBaseLoader

Код: Выделить всё

    class DataBaseCursorLoader extends CursorLoader {

        DataBase db;
        int id;

        public DataBaseCursorLoader(Context context, DataBase db, int id) {
            super(context);
            this.db = db;
            this.id = id;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor;
            if (id < 0) {
                cursor = db.getCategoryData();
            } else {
                cursor = db.getStationsData(id);
            }
            return cursor;
        }
    }
При этом, в тексте урока тоже создается объект MyCursorLoader, наследуемый от CursorLoader и там все отлично работет. Что не так??

ppp_ppp
Сообщения: 7
Зарегистрирован: 04 янв 2015, 00:56

Re: Урок 136. CursorLoader

Сообщение ppp_ppp » 11 окт 2015, 16:18

Здравствуйте.
Последний раз редактировалось ppp_ppp 11 окт 2015, 18:02, всего редактировалось 1 раз.

ppp_ppp
Сообщения: 7
Зарегистрирован: 04 янв 2015, 00:56

Re: Урок 136. CursorLoader

Сообщение ppp_ppp » 11 окт 2015, 17:58

Здравствуйте!
Сомневаюсь, что иду правильным путем...

Задача у меня стоит следующая:
создать listview, с кастомным layout(к примеру пару картинок, текст...).
listview заполняется из базы данных.
нужно сделать так, чтобы при нажатии на элементы(на картинку и текст) происходило какие-либо действия.

могу реализовать это с помощью BaseAdapter, но очень много геморроя с обновлением адаптера и так далее. Начал делать и немного ужаснулся.

Что посоветуете сделать? Создать свой класс наследующий SimpleCursorAdapter? и все оставшееся взять из данного урока?

Nik_VS
Сообщения: 2
Зарегистрирован: 13 окт 2015, 12:12

Re: Урок 136. CursorLoader

Сообщение Nik_VS » 13 окт 2015, 12:20

Здравствуйте! Подскажите, пожалуйста, самый оптимальный вариант или где можно похожий пример посмотреть.

Цель: создать активити в которой можно просматривать картинки. Каждая картинка показывается на весь экран и эти картинки можно перелистывать вправо или влево. После нажатия на картинку, открывается следующее активити с этой же картинкой и её описанием (стоящим под картинкой). Опять же нажав на эту картинку (которая во втором активити), можно посмотреть несколько других картинок по этой же теме. (См. картинку ниже)

Вопросы:
1. Что лучше использовать для просмотра картинок – ListView или как-то сделать в GridView в один столбик..., или есть другие варианты (Fragment?..)?
2. Куда загрузить сами картинки – в drawable или assets?
3. Создана небольшая база данных с _id, именем и URL картинки (сейчас они лежат в drawable). Пока ещё не могу точно понять, как их в ListView при перелистывании подгружать. Может, стоит просто все URLы картинок в ArrayList записать?
4. В уроке 136 описывается про картинки очень коротко... Думаю, что с CursorLoader можно всё это реализовать, но немного путаюсь пока. :oops:
Заранее спасибо! :)
Вложения
ImagesScreen.png
ImagesScreen.png (9 КБ) 12877 просмотров

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 136. CursorLoader

Сообщение Foenix » 13 окт 2015, 17:36

ViewPager, Picasso.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить