2016-08-09 9 views
0

私は、HistoryAdapterクラスのHistoryFragmentクラスからメソッドを実行したいと考えています。私はこのメソッドを実行したい場所をコメントしました。私がしようとしていることを別の方法で見ることができるなら、私はすべての耳です。私は、アイテムリストが空である(データが表示されていない)ときに、テキストビューに「履歴なし」を表示させたいと思います。あなたの意見を聞くのが大好きです!ここで おかげアダプタクラス内のフラグメントクラスからメソッドを実行

は、カスタムリストビューを作成するために私のアダプタクラスである:ここで

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を設定することは問題だ –

+0

なぜアダプターからそれをしたいのですか?フラグメントから空のビューを構成すると、アダプタが空のときに自動的に表示されます。 – kcoppock

答えて

1

更新日: インタフェースを作成します。このように:。

HistoryAdapterListener.javaHistoryAdapterListenerContextのためのあなたのアダプタ作成したオブジェクトで

public interface HistoryAdapterListener { 
    void callSetText(); 
} 

(ちょうどあなたのDatabaseHandler dbに行以下)

private HistoryAdapterListener mHistoryAdapterListener; 
private Context mContext; 

そして、それらを設定しますあなたは、HistoryAdapterListenerパラメータのHistoryFragmentインスタンスを渡します(hフラグメントは、以下のインタフェースを実装するように更新されています)。

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; 
    } 

Now。私たちはあなたのアダプターでインターフェースメソッドを呼び出します。そして、インタフェースオブジェクトを作成者コンテキストの参照に設定します。したがって、あなたのフラグメントへのインターフェイスを実装するようになりました。そうすれば、インターフェイスメソッドが呼び出すときに、実装メソッドがトリガされます。 のフラグメントには、まずインターフェイスを実装します。

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

これを実行した後、Androidスタジオは実装されたクラスのメソッドをオーバーライドするよう警告します。 あなたのフラグメントでは、実装されたインターフェイスメソッドをオーバーライドします。

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

これだけです!

編集:申し訳ありません。私はこの答えにIDEを使用しませんでした。いくつかの間違いがあります。私は更新しました。もう一度チェックしてください。

+0

私はこのエラーを受け取ります: java.lang.ClassCastException:uk.co.rascagneres.clocking_app.MainActivityは、英国のuk.co.rascagneres.clocking_app.HistoryAdapterListenerにキャストできません。 co.rascagneres.clocking_app.HistoryAdapter (HistoryAdapter.java:32) 行32 = mHistoryAdapterListener =(HistoryAdapterListener)コンテキスト; –

+0

@JacquesRascagneresここで提案されている解決策には小さな間違いがあります。 HistoryAdapterコンストラクタに明示的なHistoryAdapterListenerパラメータを設定し、HistoryFragmentインスタンスをパラメータ値として渡す必要があります。私はこれを修正した編集を提出しましたが、まだ保留中です。ベスト –

+0

@JanusVarmarkenおそらく、pastebinの編集を投稿して私にリンクしていますか? –

関連する問題