Android-фрагмент для фрагментации связи: обновление recyclerView ReceiverFragment через интерфейс - PullRequest
0 голосов
/ 31 января 2019

У меня есть два фрагмента, и я пытаюсь обновить recyclerView ReceiverFragment через интерфейс.Оба фрагмента имеют свой собственный адаптер (SenderAdapter и ReceiverAdapter).

Я должен упомянуть, что у меня также есть две базы данных SQLDatabase, где group.db используется для заполнения SenderFragment, а client.db используется для заполнения ReceiverFragment.

Но ReceiverFragment будет заполняться только в том случае, если в SenderAdapter установлен флажок.

Все взаимодействие между фрагментами в порядке.Когда я отмечаю флажок, SenderAdapter отправляет сообщение в MainActivity, а MainActivity отправляет то же сообщение в ReceiverFragment.

Это SenderFragment:

This is the SenderFragment:

Это будет желаемый результат.

desired result

Когда я использую сообщение из интерфейса для чтения client.db, я получаю исключение nullException.

Это ReceiverFragment:

public class ReceiverFragment extends Fragment {

    View view;
    private RecyclerView mClientList;
    private RecyclerView.Adapter mClientListAdapter;
    private RecyclerView.LayoutManager mClientListLayoutManager;

    private String receivedFromSender;

    ArrayList<ClientObject> clientList;

    SQLiteDatabase clientListTable;
    ClientRepository clientRepository;


    private static String rootPath = Environment.getExternalStorageDirectory()+"/PassKeyBF/";


    public ReceiverFragment() {
        // Required empty public constructor
    }

    public String getMessageFromSender(String message){
        if (message != null) {
            receivedFromSender = message;
            Log.i("debinf recfrag", "message from sender (function) is : " + receivedFromSender);

            //Log.i("debinf recgfrag", "mContext in interface : " + mContext);

            if (message != null) {
                if (new File(rootPath + receivedFromSender, "client.db").isFile()) {
                    clientReading(message);
                }
            }                                  


        }

        return null;

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_receiver, container, false);

        // If I use mContext instead of getContext(), I get rid of the context error showed below.
        //mContext = getContext();

        clientList = new ArrayList<>();

        initializeRecyclerView();
        //clientReading("-LWBPaM7RA9UOcUVty79");

        return view;
    }

    private void clientReading(String pathToClientTable) {

        if (new File(rootPath + pathToClientTable, "client.db").isFile()) {

            Log.i("debinf recgfrag", "mContext in clientReading" + mContext);

            ClientDatabaseHelper clientDatabaseHelper = new ClientDatabaseHelper(mContext,"client.db", rootPath+pathToClientTable+"/");

            clientListTable = clientDatabaseHelper.getReadableDatabase();
            clientRepository = new ClientRepository(clientListTable);

            clientList = clientRepository.SearchAllClients();
            Log.i("debinf recfrag", "clientList in clientReading is " + clientList.get(0).getName());
            mClientListAdapter = new ReceiverAdapter(mContext,clientList);
            mClientList.setAdapter(mClientListAdapter);
            //mClientListAdapter.notifyDataSetChanged();

        }

    }

    private void initializeRecyclerView() {

        mClientList = (RecyclerView) view.findViewById(R.id.clientList);
        mClientList.setNestedScrollingEnabled(false);
        mClientList.setHasFixedSize(false);
        mClientListLayoutManager = new LinearLayoutManager(mContext,LinearLayout.VERTICAL,false);
        mClientList.setLayoutManager(mClientListLayoutManager);

        mClientListAdapter = new ReceiverAdapter(mContext,clientList);
        mClientList.setAdapter(mClientListAdapter);

    }

}

Это ReceiverAdapter

public class ReceiverAdapter extends RecyclerView.Adapter<ReceiverAdapter.ReceiverViewHolder> {

    ArrayList<ClientObject> clientList;
    Context mContext;

    private ReceiverAdapter adapter;

    public ReceiverAdapter(Context mContext, ArrayList<ClientObject> clientList) {
        this.clientList = clientList;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ReceiverViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_callcenter_client, null, false);

        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutView.setLayoutParams(lp);

        ReceiverViewHolder rcv = new ReceiverViewHolder(layoutView);
        return rcv;
    }

    @Override
    public void onBindViewHolder(@NonNull ReceiverViewHolder holder, int position) {

        holder.mName.setText(clientList.get(position).getName());
        holder.mPhone.setText(clientList.get(position).getPhone());

    }

    @Override
    public int getItemCount() {
        return clientList.size();
    }

    public class ReceiverViewHolder extends RecyclerView.ViewHolder {

        public TextView mName, mPhone;
        //public LinearLayout mLayout;

        public ReceiverViewHolder(@NonNull View itemView) {
            super(itemView);

            mName = (TextView) itemView.findViewById(R.id.client_name);
            mPhone = (TextView) itemView.findViewById(R.id.client_phone);
            //mLayout = (LinearLayout) itemView.findViewById(R.id.layoutItemClient);
        }
    }
}

EDIT

Я изменилReceiverFragment, чтобы он мог быть более понятным.

Это ФАТАЛЬНАЯ ОШИБКА, которую я получаю, когда использую getContext ().Я просто не могу установить соединение с моей базой данных SQL.

2019-01-31 15:41:45.118 22318-22318/com.example.aliton.passkeybetweenfrags E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.aliton.passkeybetweenfrags, PID: 22318
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:352)
        at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:322)
        at com.example.aliton.passkeybetweenfrags.ReceiverFragment.clientReading(ReceiverFragment.java:104)
        at com.example.aliton.passkeybetweenfrags.ReceiverFragment.getMessageFromSender(ReceiverFragment.java:53)
        at com.example.aliton.passkeybetweenfrags.MainActivity.getMessage(MainActivity.java:64)
        at com.example.aliton.passkeybetweenfrags.SenderAdapter$1.onCheckedChanged(SenderAdapter.java:54)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:171)
        at android.widget.CompoundButton.toggle(CompoundButton.java:127)
        at android.widget.CompoundButton.performClick(CompoundButton.java:132)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Теперь, когда я подавляю getContext () и делаю его статическим в mContext.Я могу установить соединение с SQLDatabase, но я получаю эту ФАТАЛЬНУЮ ошибку, потому что ReceiverAdapter:

2019-01-31 15:35:05.541 21936-21936/com.example.aliton.passkeybetweenfrags E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.aliton.passkeybetweenfrags, PID: 21936
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
        at com.example.aliton.passkeybetweenfrags.ReceiverFragment.clientReading(ReceiverFragment.java:110)
        at com.example.aliton.passkeybetweenfrags.ReceiverFragment.getMessageFromSender(ReceiverFragment.java:53)
        at com.example.aliton.passkeybetweenfrags.MainActivity.getMessage(MainActivity.java:64)
        at com.example.aliton.passkeybetweenfrags.SenderAdapter$1.onCheckedChanged(SenderAdapter.java:54)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:171)
        at android.widget.CompoundButton.toggle(CompoundButton.java:127)
        at android.widget.CompoundButton.performClick(CompoundButton.java:132)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Я могу получить ошибку либо при чтении базы данных SQL (client.db), либо при обновлении ReceiverAdapter.

Это ссылка на главную папку приложения:

https://1drv.ms/u/s!AjteqjTsJm9qgn6kODT9OJmMcY4e

Это ссылка на базу данных SQL (group.db и client.db)

https://1drv.ms/u/s!AjteqjTsJm9qgn_L52cz3lDWOOWe

1 Ответ

0 голосов
/ 01 февраля 2019

Я наконец-то нашел ответ.

Вся проблема произошла в MainActivity.Я связывался с MainActivity с ReceiverFragment следующим образом:

ReceiverFragment receiverFragment = new ReceiverFragment();

И отправлял сообщение следующим образом:

   @Override
    public void getMessage(String message) {

        receiverFragment.getMessageFromSender(message);

    }

Сообщение было передано из MainActivity в ReceiverFragment нормально, но яполучал исключение NullPointerException для recyclerView для ReceiverFragment.

Проблема была решена с помощью следующего способа доставки сообщения в ReceiverFragment (ответ найден по этой ссылке https://www.journaldev.com/14207/android-passing-data-between-fragments):

@Override
    public void getMessage(String message) {

        String tag = "android:switcher:" + R.id.tabs_pager + ":" + 1;
        ReceiverFragment rf = (ReceiverFragment) getSupportFragmentManager().findFragmentByTag(tag);
        rf.getMessageFromSender(message);

    }

Ссылки для кода и базы данных SQL (group.db и client.db) по-прежнему доступны для загрузки.

Для тех, кто запускается в Android, как я и заинтересован в коде, пожалуйста, не забудьте:измените функцию доставки в MainActivity.

Спасибо всем и удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...