2016-08-09 82 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是的,它不是那部分很难。它在HistoryAdapter中设置textview就是这个问题 –

+0

为什么你想从适配器上做到这一点呢?如果您从片段配置空视图,则在适配器为空时应自动显示。 – kcoppock

回答

1

更新时间: 创建界面。是这样的:

HistoryAdapterListener.java

public interface HistoryAdapterListener { 
    void callSetText(); 
} 

在为HistoryAdapterListenerContext适配器创建对象(只需在下面一行到你的DatabaseHandler db

private HistoryAdapterListener mHistoryAdapterListener; 
private Context mContext; 

并设置他们在我们将为HistoryAdapterListener参数传入HistoryFragment实例(请参阅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(); 
} 

就是这样!

编辑:对不起。我没有使用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) Line 32 = mHistoryAdapterListener =(HistoryAdapterListener)context; –

+0

@JacquesRascagneres在这里提出的解决方案中存在一个小错误。您需要在HistoryAdapter构造函数中使用显式HistoryAdapterListener参数,并将HistoryFragment实例作为参数值传入。我提交了修正此问题的修改,但仍处于待决状态。最佳 –

+0

@JanusVarmarken也许发布在pastebin上的编辑并将它们链接到我? –