2017-08-18 18 views
0

私はアンドロイドで新しく、これをやりたいのですが問題があります。 私は任意のListViewに読み込むことができ、私はAsyncTaskでこれをやりたいだけの多くのadaperを持っています。私はAsyncTaskでこれを行うクラスを持っており、これはクラスでのListViewへの負荷データのasynctaskクラスのlistViewに設定

package com.example.mohammad.workclock; 

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

import com.example.mohammad.workclock.Tbls.Projects; 

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


public class projectAdapter extends BaseAdapter { 

private Context context; 

private LayoutInflater layoutInflater; 

private List<Projects> listProject = new ArrayList<>(); 

private ListView listView; 
public projectAdapter(Context context) { 
    this.context = context; 
    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

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

@Override 
public Object getItem(int i) { 
    return listProject.get(i); 
} 

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

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View Row = layoutInflater.inflate(R.layout.itemsproject, parent, false); 

    listView = (ListView) parent; 


    TextView Txt_Title = (TextView) Row.findViewById(R.id.txt_Title); 
    Projects P = (Projects) getItem(position); 
    Txt_Title.setText(P.getTitle()); 

    return Row; 
} 


public void upDateInputData(List<Projects> listProject) { 
    this.listProject = listProject; 
    notifyDataSetChanged(); 
} 

}

::私がしたいとき

 class loadAsyncTaskToListView extends AsyncTask<Void, Void, ArrayList<T>> { 
     private SQLiteDatabase db; 
     private Context context; 
     private T adapter; 
     private ProgressDialog progressDialog; 
     private String tableName; 
     private N object_; 

     public loadAsyncTaskToListView(Context context, T adapter, N object, String tableName){ 
      this.context = context; 
      db = getReadableDatabase(); 
      this.adapter = adapter; 
      this.tableName = tableName; 
      this.object_ = object; 
     } 


     @Override 
     protected void onPreExecute() { 
      progressDialog = ProgressDialog.show(this.context, "","در حال بارگذاری"); 
     } 


     @Override 
     protected ArrayList doInBackground(Void... voids) { 
      String Query = " SELECT * FROM " + tableName; 
      List<N> ListTobject = new ArrayList<>(); 
      Cursor cursor = db.rawQuery(Query, null); 

      if (cursor.moveToFirst()) 
       do { 
        N object = this.object_; 
        for (Field field : listField) { 

         Annotation AnnotationF = field.getAnnotation(AnnotationPartialClass.field.class); 
         AnnotationPartialClass.field fieldAnnotation = (AnnotationPartialClass.field) AnnotationF; 

         field.setAccessible(true); 

         setvalueToobject(object, field, cursor.getString(cursor.getColumnIndex(fieldAnnotation.NameField()))); 



        } 

       } 
       while (cursor.moveToNext()); 
      return (ArrayList<T>) ListTobject; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<T> inputObjects) { 
      ((projectAdapter)adapter).upDateInputData((List<Projects>) inputObjects); 
      progressDialog.dismiss(); 
     } 

     public <N>void setvalueToobject(N object, Field field, Object fieldValue){ 
       field.setAccessible(true); 
      try { 
       field.set(object, fieldValue); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

は知っている私のすべてのアダプタは、このようなものですこのメソッドを使用する私の活動でこのコードを書いてください:

projectAdapter dd = new projectAdapter(this); 
LV.setAdapter(dd); 
// LV is my ListView 
LoadToListView(LV,dd, new Projects(),""); 

私はエラーリストを持っていますこれは:

08-18 13:18:28.999 26047-26163/com.example.mohammad.workclock 
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 

Process: com.example.mohammad.workclock, PID: 26047 
                      java.lang.RuntimeException: An error occurred while executing doInBackground() 
                       at android.os.AsyncTask$3.done(AsyncTask.java:325) 
                       at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
                       at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
                       at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                       at java.lang.Thread.run(Thread.java:761) 
                      Caused by: java.lang.IllegalArgumentException: field com.example.mohammad.workclock.Tbls.Projects.ID has type int, got java.lang.String 
                       at java.lang.reflect.Field.set(Native Method) 
                       at com.example.mohammad.workclock.AsyncTask.WholeWorWithDb$1loadAsyncTaskToListView.setvalueToobject(WholeWorWithDb.java:383) 
                       at com.example.mohammad.workclock.AsyncTask.WholeWorWithDb$1loadAsyncTaskToListView.doInBackground(WholeWorWithDb.java:357) 
                       at com.example.mohammad.workclock.AsyncTask.WholeWorWithDb$1loadAsyncTaskToListView.doInBackground(WholeWorWithDb.java:306) 
                       at android.os.AsyncTask$2.call(AsyncTask.java:305) 
                       at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)  
                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)  
                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)  
                       at java.lang.Thread.run(Thread.java:761)  

どのように修正できますか?

+0

私のエラーは、この行のsetvalueToobjectメソッドにあります。field.set(object、fieldValue); – user2591714

答えて

1

あなたのlogcatに記載されているとおり、問題はここにある:
フィールドcom.example.mohammad.workclock.Tbls.Projects.IDだから、あなたがint型を期待している をjava.lang.Stringでしまった、int型を持っていますですが、文字列が代わりにあります。

P.S.これは、ジャックポットのように思える:
リストビュー+ AssyncTask +反射)
あなたはそこかもしれあなたの「プロジェクト」クラスでは、この行の問題

setvalueToobject(object,field,cursor.getString(cursor.getColumnIndex(fieldAnnotation.NameField()))); 

を持って将来

0

にすべてこのようなものを避けるようにしてください異なるデータ型を持つ多くのフィールドになります。 しかし、フィールド値を文字列として送信しています(つまり、Int型のフィールドで、文字列値を格納しようとしています)。 異なるデータ型のフィールドがある場合。次に、あなたはこの例外を取得します。

field.getType()メソッドでフィールドの型をチェックし、その型のフィールド値を "setvalueToobject"メソッドに送信する必要があります。

私はうまくいきたいと思います。

関連する問題