2016-08-09 3 views
0

Я хотел бы иметь возможность запускать метод из класса HistoryFragment в классе HistoryAdapter. Я прокомментировал место, где я хотел бы запустить этот метод. Если вы можете увидеть другой путь вокруг того, что я пытаюсь сделать, я все уши. Я хочу сделать отображение текста «Нет истории в наличии», когда список элементов пуст (данные не отображаются). Хотелось бы услышать ваш вход! БлагодаряВыполнить метод из класса Fragment внутри класса адаптера

Вот мой адаптер класса для создания пользовательских ListView:

package uk.co.rascagneres.clocking_app; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.TextView; 

import java.util.ArrayList; 

/** 
* Created by Jacques on 08/08/2016. 
*/ 
public class HistoryAdapter extends BaseAdapter implements ListAdapter{ 
    private ArrayList<String> list = new ArrayList<String>(); 
    private Context context; 
    public ArrayList<String> idArray = new ArrayList<String>(); 
    DatabaseHandler db; 


    public HistoryAdapter (ArrayList<String> list, Context context, ArrayList<String> idArray, DatabaseHandler db){ 
     this.list = list; 
     this.context = context; 
     this.idArray = idArray; 
     this.db = db; 
    } 

    @Override 
    public int getCount(){ 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int pos){ 
     return list.get(pos); 
    } 

    @Override 
    public long getItemId(int pos){ 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 
     View view = convertView; 
     if(view == null){ 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.history_list, null); 
     } 
     final View innerView = view; 
     TextView listItemText = (TextView)view.findViewById(R.id.list_item_string); 
     listItemText.setText(list.get(position)); 

     Button deleteBtn = (Button)view.findViewById(R.id.delete_btn); 

     deleteBtn.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       db.deleteRowID(Integer.parseInt(idArray.get(position))); 
       list.remove(position); 
       notifyDataSetChanged(); 
       idArray.remove(position); 
       //RUN setText() in HistoryFragment from here! 
      } 
     }); 
     return view; 
    } 
} 

Вот мой HistoryFragment класс:

package uk.co.rascagneres.clocking_app; 

import android.app.Fragment; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Jacques on 03/08/2016. 
*/ 
public class HistoryFragment extends Fragment { 
    DatabaseHandler db; 
    View myView; 
    ArrayList<String> historyArray = new ArrayList<String>(); 
    ArrayList<String> idArray = new ArrayList<String>(); 



    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     myView = inflater.inflate(R.layout.history_layout, container, false); 
     db = new DatabaseHandler(getActivity()); 

     ArrayList<String> list = insertData(); 

     HistoryAdapter adapter = new HistoryAdapter(list, getActivity(), idArray, db); 

     ListView lView = (ListView)myView.findViewById(R.id.listView); 
     lView.setAdapter(adapter); 
     return myView; 
    } 

    public ArrayList<String> insertData(){ 
     Cursor c = db.getAllData(); 
     ArrayList<String> list = new ArrayList<String>(); 
     while(c.moveToNext()) { 
      int id = c.getInt(0); 
      long in = c.getLong(1); 
      long out = c.getLong(2); 
      String outTime; 

      if(out == 0){ 
       outTime = "N/A"; 
      }else{ 
       outTime = ClockingFragment.getDate(out, "HH:mm"); 
      } 

      String date = ClockingFragment.getDate(in, "EEE, MMM d"); 
      String inTime = ClockingFragment.getDate(in, "HH:mm"); 

      historyArray.add(date + "\n Clocked In: " + inTime + "\n Clocked Out: " + outTime + "\n"); 
      idArray.add(String.valueOf(id)); 
     } 
     TextView histAvail = (TextView)myView.findViewById(R.id.noHist); 
     if (historyArray.isEmpty()){ 
      histAvail.setText("No History Available!"); 
     }else { 
      histAvail.setText(""); 
     } 
     return historyArray; 
    } 

    public ArrayList<String> getIdArray(){ 
     System.out.println(idArray); 
     return idArray; 
    } 

    public void setText(){ 
     TextView histAvail = (TextView)myView.findViewById(R.id.noHist); 
     histAvail.setText("No History Available!"); 
    } 


} 
+0

Похоже, что вы можете посмотреть на свойство пустого представления ListView: http://cyrilmottier.com/2011/06/20/listview-tips-tricks-1-handle-emptiness/ – kcoppock

+0

@kcoppock Да, его нет эта часть сложная. Его настройка textview изнутри HistoryAdapter вызывает вопрос –

+0

Почему вы хотите сделать это с адаптера? Если вы сконфигурируете пустой фрагмент из фрагмента, он должен автоматически отображаться, когда адаптер пуст. – kcoppock

ответ

1

Обновлено: Создание интерфейса. Как это:.

HistoryAdapterListener.java

public interface HistoryAdapterListener { 
    void callSetText(); 
} 

В ваших адаптер создания объектов для HistoryAdapterListener и Context (Чуть ниже линии вашего DatabaseHandler db)

private HistoryAdapterListener mHistoryAdapterListener; 
private Context mContext; 

и поставил их в ваш конструктор. Мы собираемся передать экземпляр HistoryFragment для параметра HistoryAdapterListener (см. h ow фрагмент обновлен для реализации интерфейса ниже).

public HistoryAdapter (ArrayList<String> list, Context context, ArrayList<String> idArray, DatabaseHandler db, HistoryAdapterListener listener){ 
     this.list = list; 
     this.context = context; 
     this.idArray = idArray; 
     this.db = db; 
     //here my codes begin 
     mContext = context; 
     mHistoryAdapterListener = listener; 
     //here it is ended 
    } 

Мы по-прежнему находимся в вашем адаптере. Мы еще не закончили. Позволяет использовать метод интерфейса вызова.

@Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 
     ... 
     deleteBtn.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       ... 
       //RUN setText() in HistoryFragment from here! 
       if(mHistoryAdapterListener != null){ 
       mHistoryAdapterListener.callSetText(); 
       } 
      } 
     }); 
     return view; 
    } 

Теперь. Мы называем метод интерфейса в вашем адаптере. И мы устанавливаем объект интерфейса на ссылку контекста создателя. Итак, теперь реализуем интерфейс к вашему фрагменту, поэтому при вызове метода интерфейса ваш метод реализации запускается. В вашем фрагменте, сначала реализуйте интерфейс.

public class HistoryFragment extends Fragment implements HistoryAdapterListener{ 
... 
} 

После этого Android Studio предупредит вас о переопределении методов реализованного класса. Итак, снова в вашем фрагменте переопределите реализованный интерфейс.

@Override 
public void callSetText(){ 
setText(); 
} 

Всё!

Редактировать: Sorry. Я не использовал IDE для этого ответа. Есть некоторые ошибки. Я обновил. Повторите проверку.

+0

Я получаю эту ошибку: java.lang.ClassCastException: uk.co.rascagneres.clocking_app.MainActivity не может быть переведена на uk.co.rascagneres.clocking_app.HistoryAdapterListener на uk. co.rascagneres.clocking_app.HistoryAdapter. (HistoryAdapter.java:32) Строка 32 = mHistoryAdapterListener = (HistoryAdapterListener) контекст; –

+0

@JacquesRascagneres есть небольшая ошибка в предлагаемом здесь решении. В конструкторе HistoryAdapter необходимо указать явный параметр HistoryAdapterListener и передать его в качестве параметра-значения в свой экземпляр HistoryFragment. Я отправил исправление, которое исправляет это, но оно все еще ожидает. Best –

+0

@JanusVarmarken Возможно, опубликуйте изменения на pastebin и соедините их со мной? –

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