2012-01-19 11 views
6

Pracuję z klasą BaseAdapter. Chcę wyświetlić w nim DatePickerDialog. Podczas korzystania z showDialog(DATE_DIALOG_ID); pojawia się błąd.Jak korzystać z DatePickerDialog w BaseAdapter

Proszę, poprowadź mnie w tej sprawie.

pakiet com.OrganisemeePhone.adapter;

import java.util.ArrayList; 
import java.util.Vector; 

import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.provider.OpenableColumns; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.DatePicker; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.CompoundButton.OnCheckedChangeListener; 




public class TaskFilterAdapter extends BaseAdapter { 
    String date, month, year,setdueDate; 
    //int dateFormat; 
    DatePickerDialog.OnDateSetListener dateListener; 

    int myYear, myMonth, myDay; 
    int dateFormat; 
    int starcount=0; 

    public TaskFilterAdapter datedialog; 

    viewholder holder; 
    LayoutInflater inflator; 
    ArrayList<Integer> taskId = new ArrayList<Integer>(); 
    ArrayList<String> task = new ArrayList<String>(); 
    ArrayList<String> dueDate = new ArrayList<String>(); 
    ArrayList<Integer> priority = new ArrayList<Integer>(); 
    static final int DATE_DIALOG_ID = 0; 
    Vector<Boolean> VectorCheckChange = new Vector<Boolean>(); 
    Vector<Object> taskrow = new Vector<Object>(); 

    static int pos; 
    Context context; 
    private boolean isdaymonth; 
    public TaskFilterAdapter(Context context,ArrayList<Integer> taskId, ArrayList<String> task, ArrayList<Integer> priority, ArrayList<String> duedate) { 
     super(); 

     inflator = LayoutInflater.from(context); 
     this.taskId = taskId; 
     this.context=context; 

     this.task = task; 
     this.dueDate = duedate; 
     this.priority = priority; 

     //dateFormat=LoginActivity.db.getdateformat(); 
     getDateFormate(); 
     dateFormat=LoginActivity.db.getdateformat(); 
     getDateFormate(); 
     for(int i=0; i<task.size(); i++) 
     { 
      VectorCheckChange.add(false); 
     } 
    } 


    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return task.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView==null) 
     { 
      holder = new viewholder(); 
      convertView = inflator.inflate(R.layout.task_row, null); 
      holder.task = (TextView)convertView.findViewById(R.id.task_row_text); 
      holder.date = (TextView)convertView.findViewById(R.id.task_row_date_text); 
      holder.star = (ImageView)convertView.findViewById(R.id.task_row_star); 
      holder.chk = (CheckBox)convertView.findViewById(R.id.task_row_check_box); 

      holder.task.setOnClickListener(new Clicker()); 
      holder.chk.setOnCheckedChangeListener(new Checker()); 
      holder.star.setOnClickListener(new Clicker()); 
      holder.date.setOnClickListener(new Clicker()); 

      setviewAsSettings(); 

      setviewAsSettings(); 


      convertView.setTag(holder); 


      } 
     else 
     { 
      holder=(viewholder)convertView.getTag(); 
     } 


     pos = position; 

     /****************** Set Task *************************/ 

     holder.task.setText(task.get(position)); 
     holder.task.setTag(position); 
     holder.star.setTag(position); 
     holder.date.setTag(position); 



     /***************** Set Duedate ***********************/ 

     setdueDate = dueDate.get(position); 

     month = setdueDate.substring(5, 7); 
     date = setdueDate.substring(8, 10); 



     if (!date.equals("00")) 
     { 
      if (isdaymonth) 
      if (isdaymonth) 
      { 
       holder.date.setText(date + "." + month + "."); 
       Log.d("taskList Adapter"," date formate day month "); 

      } 
      else 
      { 
       holder.date.setText(month + "." + date + "."); 
       Log.d("taskList Adapter"," date formate month day"); 

      } 
     } 
     else 
     { 
      holder.date.setText(""); 
     } 



     /***************** Set Priority ***********************/ 


       if (priority.get(position).equals(-1) || priority.get(position).equals(0)|| priority.get(position).equals(3)) 
       { 

        holder.star.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.star_low)); 

       } 
       else if (priority.get(position).equals(2)) 
       { 

        holder.star.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.star_med)); 
       } 
       else if (priority.get(position).equals(1)) 
       { 

        holder.star.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.star_high)); 
       } 




     /******************* Set tag in checkBox ******************************/ 

     holder.chk.setTag(position); 

     if(VectorCheckChange.get(position)) 
     { 
      holder.chk.setChecked(true); 
      holder.task.setPaintFlags(holder.task.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      holder.task.setTextColor(Color.parseColor("#848484")); 
      holder.date.setPaintFlags(holder.task.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      holder.date.setTextColor(Color.parseColor("#848484")); 
      holder.task.setClickable(false); 
      holder.task.setEnabled(false); 
     } 
     else 
     { 
      holder.chk.setChecked(false); 
      holder.task.setPaintFlags(holder.task.getPaintFlags() & ~ Paint.STRIKE_THRU_TEXT_FLAG); 
      holder.task.setTextColor(Color.parseColor("#000000")); 
      holder.date.setPaintFlags(holder.task.getPaintFlags() & ~ Paint.STRIKE_THRU_TEXT_FLAG); 
      holder.date.setTextColor(Color.parseColor("#000000")); 
      holder.task.setClickable(true); 
      holder.task.setEnabled(true); 
     } 


     return convertView; 
    } 
    // updates by nilesh 
    public void setviewAsSettings(){ 
     //check for task setting 
     SharedPreferences startup_pref = 
      PreferenceManager.getDefaultSharedPreferences(context); 

     Boolean viewpriority=startup_pref.getBoolean("viewpriority", true); 
     Boolean viewduedate=startup_pref.getBoolean("viewduedate", true); 

      if(!viewpriority){ 
       holder.star.setVisibility(View.INVISIBLE); 
      }    
      if(!viewduedate){ 
       holder.date.setVisibility(View.INVISIBLE); 
      } 
     //check for task setting completed 
    } 

    public class viewholder 
    { 
     TextView task,date; 
     ImageView star; 
     CheckBox chk; 

    } 


    public class Clicker implements OnClickListener 
    { 


     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 


      int position=(Integer)v.getTag(); 
      int setPriority = 0; 

     if(v.getId() == holder.date.getId()) 
     { 


      Log.i("Date Dialog Picker", "Click Date..................... "); 

      ((Activity)context).showDialog(DATE_DIALOG_ID); 

     //.showDialog(DATE_DIALOG_ID); 


      //.showDialog(DATE_DIALOG_ID); 



      } 
     dateListener = new DatePickerDialog.OnDateSetListener() { 

      @Override 
      public void onDateSet(DatePicker view, int yr, int monthOfYear, 
        int dayOfMonth) { 
       // TODO Auto-generated method stub 
       myYear = yr; 
       myMonth = monthOfYear; 
       myDay = dayOfMonth; 

       } 

      }; 



     if(v.getId() == holder.task.getId()) 
     { 
      Intent display_int= new Intent(context, DisplyTaskActivity.class); 
      display_int.putExtra(constantcode.TASK_ID,taskId.get(position)); 
      v.getContext().startActivity(display_int); 

      Log.i("TaskList Adapter", "Task ....position...... "+holder.star.getTag()); 
     } 


      if(v.getId() == holder.star.getId()) 
      { 

       if (priority.get(position).equals(-1) || priority.get(position).equals(0) || priority.get(position).equals(3)) 
        { 
        priority.set(position, 2); 
        setPriority = 2; 

        holder.star.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.star_low)); 

        Log.d("TaskList Adapter", "----- Grey ----"); 
        } 
        else if (priority.get(position).equals(2)) 
        { 
         priority.set(position, 1); 
         setPriority = 1; 

        holder.star.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.star_med)); 

        Log.d("TaskList Adapter", "----- Yellow ----"); 
        } 
        else if (priority.get(position).equals(1)) 
        { 
         priority.set(position, 0); 
         setPriority = 0; 

        holder.star.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.star_high)); 

        Log.d("TaskList Adapter", "----- Orange ----"); 
        } 


        String updateQuery = "update tbl_tasks set priority =" + setPriority + " where taskId="+ taskId.get(position); 
        LoginActivity.db.execNonQuery(updateQuery); 


        taskrow = LoginActivity.db.getTaskRow(taskId.get(position)); 

        if(taskrow.get(2).toString().contains("'")) 
        { 
         taskrow.set(2, taskrow.get(2).toString().replace("'", "''")); 
        } 

        String insertQuery = "insert into tbl_update_tasks(taskId,listId,description,priority,dueDate,reminderId,senderId,receiverId,taskCategoryType,fadeDate,assignedId)values("+ taskrow.get(0) + ","+ taskrow.get(1)+ ",'"+ taskrow.get(2)+ "',"+ taskrow.get(3)+ ",'"+ taskrow.get(4)+ "',"+ taskrow.get(5)+ ","+ taskrow.get(6)+ ","+ taskrow.get(7)+ ",'"+ taskrow.get(8)+ "','"+ taskrow.get(9)+ "',"+ taskrow.get(10)+ ");"; 
        LoginActivity.db.execNonQuery(insertQuery); 
        notifyDataSetChanged(); 
      } 

       //Log.w("taskfilterAdapter","position....... "+v.getTag()); 
     } 


    } 

     Dialog onCreateDialog(int id){ 
      switch(id) { 
      case DATE_DIALOG_ID: 

       return new DatePickerDialog(this.context, dateListener, myYear, myMonth,myDay); 

      } 

      return null; 

     } 

    /* public class datedialogclicker extends Activity 
    { 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 



      holder.date.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 

        Log.v("New Class....", "Click OnClick....."); 
        showDialog(DATE_DIALOG_ID); 
       } 

      }); 

      dateListener = new DatePickerDialog.OnDateSetListener() { 

       @Override 
       public void onDateSet(DatePicker view, int yr, int monthOfYear, 
         int dayOfMonth) { 
        // TODO Auto-generated method stub 
        myYear = yr; 
        myMonth = monthOfYear; 
        myDay = dayOfMonth; 

        } 

       }; 



     } 
     protected Dialog onCreateDialog(int id){ 
       switch(id) { 
       case DATE_DIALOG_ID: 

        return new DatePickerDialog(context, dateListener, myYear, myMonth,myDay); 

       } 

       return null; 

      } 
    }*/ 

    public class Checker implements OnCheckedChangeListener 
    { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      // TODO Auto-generated method stub 

      int posi=(Integer)buttonView.getTag(); 

      if(isChecked) 
      { 
       VectorCheckChange.set(posi, true);    
      } 
      else 
      { 
       VectorCheckChange.set(posi, false); 
      } 

      notifyDataSetChanged(); 


     } 

    } 
    // update by nilesh 
    public void getDateFormate() { 

     // Get the app's shared preferences 
     SharedPreferences startup_pref = PreferenceManager 
       .getDefaultSharedPreferences(context); 

     // Get the value for the run counter 
     isdaymonth = startup_pref.getBoolean(constantcode.ISDAYMONTH, true); 
    } 


} 
+0

pisać swój błąd logcat również –

+0

Jakiego rodzaju błąd dostaniesz? –

+0

@Android używasz wyboru daty w widoku listy ??? – Maverick

Odpowiedz

3

(1) Określ ten kod w BaseAdapter onClick

((Activity)AdapterName.this.context).showDialog(DATE_DIALOG_ID); 

(2) poniżej kod w działalność:

DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() { 

       @Override 
       public void onDateSet(DatePicker view, int yr, int monthOfYear, 
         int dayOfMonth) { 
        // TODO Auto-generated method stub 
        myYear = yr; 
        myMonth = monthOfYear; 
        myDay = dayOfMonth; 

       } 


     }; 


     Calendar cal = Calendar.getInstance(); 
     myYear = cal.get(Calendar.YEAR); 
     myMonth = cal.get(Calendar.MONTH); 
     myDay = cal.get(Calendar.DAY_OF_MONTH); 


protected Dialog onCreateDialog(int id){ 
      switch(id) { 
      case DATE_DIALOG_ID: 

       return new DatePickerDialog(ActivityName.this, dateListener, myYear, myMonth, myDay); 

      } 
      return null; 

     } 
+1

+1 thnx za wsparcie. –

+0

well come @Bhavesh – Android

+1

Idealne rozwiązanie. !! – MKJParekh

1

Błąd jest łatwy do uzasadnienia: nie jest wyjątkiem, jest to błąd kompilacji - showDialog jest metodą klasy Activity. Czy programiści Androida mogą tak łatwo zapomnieć, że wszystkie te miłe pomocnicze metody powinny być dostarczane przez niektóre klasy, prawda?

Chodzi o to, że OnClickListener nie jest Activity. Uczynić konstruktor klasy przyjmującej pojedynczą aktywność parametru, należy go przechowywać w zmiennej lokalnej, a następnie wywołać jego metodę ShowDialog:

private Activity activity; 
public Clicker(Activity activity) { 
    this.activity = activity; 
} 

... 
    this.activity.showDialog(); 
... 
+0

Próbuję tego. teraz nie daje błędu, ale datepickerdialog nie jest wyświetlany. – Android

+0

Cóż, widzę, że to wyświetlanie zależy od pewnych warunków. Upewnij się, że te warunki są spełnione i uruchamiasz zdarzenie onClick. Ty logCat do tego celu. –

0

wychodził problem przechowywania wartości datepicker w ListView ale rozwiązany it.This jest kod it.Hope to pomaga.

import java.util.ArrayList; 
import java.util.Calendar; 
import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.DatePicker; 
import android.widget.ListView; 
import android.widget.TextView; 

public class DAteDemo extends Activity{ 

    private ListView listViewScore = null; 
    private ListViewAdapter listViewAdapter = null; 
    static final int DATE_DIALOG_ID = 0; 

    private int mYear;  
    private int mMonth; 
    private int mDay; 
    int globalPosition; //used for storing the position of textview clicked for setting the date 

    ArrayList<String> mfddateList = null; 
    int viewlength = 30; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     listViewScore=(ListView)findViewById(R.id.listViewScore); 

     mfddateList = new ArrayList<String>(); 
     for(int i=0;i<30;i++){ 
      mfddateList.add(""); 
     } 

     final Calendar c = Calendar.getInstance();   
     mYear = c.get(Calendar.YEAR);   
     mMonth = c.get(Calendar.MONTH);   
     mDay = c.get(Calendar.DAY_OF_MONTH); 

     listViewAdapter = new ListViewAdapter(); 
     listViewScore.setAdapter(listViewAdapter); 


    } 

    class ListViewAdapter extends BaseAdapter{ 

     @Override 
     public int getCount() { 

      return viewlength; 
     } 

     @Override 
     public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public View getView(int position, View view, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      final ViewHolder viewHolder ; 
      View rowView=view; 

      if(rowView==null){ 
       LayoutInflater layoutinflate =LayoutInflater.from(DAteDemo.this); 
       rowView=layoutinflate.inflate(R.layout.listviewnewtext, parent, false); 

       viewHolder = new ViewHolder(); 

       viewHolder.et_Sort_Order = (TextView)rowView.findViewById(R.id.et_Sort_Order); 

       //Setting listen to the text box 
       viewHolder.et_Sort_Order.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         showDialog(DATE_DIALOG_ID); 
         globalPosition = viewHolder.ref; // this is used to update the date 
         Log.i("Log","date:-- "+viewHolder.ref); 
        } 

       }); 

       rowView.setTag(viewHolder); 
      }else{ 
       viewHolder = (ViewHolder) rowView.getTag(); 
      } 

      viewHolder.ref = position; 

      viewHolder.et_Sort_Order.setText(mfddateList.get(position)); 



      return rowView; 
     } 
    }//class ends 

    class ViewHolder{ 
     TextView et_Sort_Order; 
     int ref; 
    } 

    // the callback received when the user "sets" the date in the dialog  
    public DatePickerDialog.OnDateSetListener mDateSetListener =    
     new DatePickerDialog.OnDateSetListener() {     
     public void onDateSet(DatePicker view, int year,          
       int monthOfYear, int dayOfMonth) {      
      mYear = year;      
      mMonth = monthOfYear;      

      String date = (mMonth + 1)+"/"+mYear; 
      mfddateList.set(globalPosition,date); 
      Log.i("Log", "i m in dateset "+globalPosition); 
      listViewAdapter.notifyDataSetChanged(); //for updating the date change 

     }    
    }; 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) {  
     case DATE_DIALOG_ID:   
      return new DatePickerDialog(DAteDemo.this,mDateSetListener,mYear, mMonth,mDay);  
     }  
     return null; 
    } 

}//ActivityEnds 


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


<ListView 
    android:layout_width="match_parent" 
    android:id="@+id/listViewScore" 
    android:cacheColorHint="#00000000" 
    android:layout_height="match_parent" 
    android:layout_weight="1.00" 
    android:divider="#C0C0C0" 
    android:layout_below="@+id/layout" 
    android:dividerHeight="2dip" 
    android:background="@android:color/white" /> 

**listviewnewtext.xml** 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="2dip" 
    android:paddingBottom="0dip" 
    > 

    <TextView 
     android:textColor="@android:color/black" 
     android:layout_height="wrap_content" 
     android:layout_width="80dip" 
     android:focusable="false" 
     android:id="@+id/et_Sort_Order" 

     > 

    </TextView> 


</LinearLayout> 
+0

ten kod jest w klasie Activity.? – Android

+0

@Android Tak ... wszystko jest w klasie Activity ... zadeklarowane zmienne są globalne ... getview jest w klasie, która rozszerza bazadapter – Maverick

+0

Pracuję tylko z klasą BaseAdapter. – Android