2017-03-23 21 views
0

首先,我想通知我創建一個android應用程序,允許用戶查看和註冊聯繫,通過使用sqlite存儲數據
而且,我使用AsyncTask來執行插入和查看數據。
現在,我想知道應該在哪裏編寫可點擊的視圖列表代碼。
它應該寫在backgroudTask中還是在displaycontact頁面中?
有人可以提供一些示例如何植入它?
以下是示例代碼和一些解釋。
這是backgoundTask。哪裏是合適的頁面放置點擊列表查看代碼

package com.example.assignment; 

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.AsyncTask; 
import android.widget.ListView; 
import android.widget.Toast; 

public class BackgroundTask extends AsyncTask <String ,Contact, String> { 

    Context ctx; 
    ContactAdapter contactAdapter; 
    Activity activity; 
    ListView listView; 
    BackgroundTask(Context ctx){ 
     this.ctx = ctx; 
     activity = (Activity)ctx; 

    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Contact... values) { 
     contactAdapter.add(values[0]); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     String method = params[0]; 
     DatabaseOperations databaseOperations = new DatabaseOperations(ctx); 
     if (method.equals("add_info")){ 

      String cFamName = params[1]; 
      String cFirName = params[2]; 
      String cHouseNo = params[3]; 
      String cStreet = params[4]; 
      String cTown  = params[5]; 
      String cCountry = params[6]; 
      String cPostcode = params[7]; 
      String cTelNo = params[8]; 
      SQLiteDatabase db = databaseOperations.getWritableDatabase(); 
      databaseOperations.putInformation(db ,cFamName,cFirName,cHouseNo,cStreet,cTown,cCountry,cPostcode,cTelNo); 
      return "One Row Inserted..."; 
     } 
     else if(method.equals("get_info")){ 
      listView = (ListView)activity.findViewById(R.id.display_listview); 
      SQLiteDatabase db = databaseOperations.getReadableDatabase(); 
       Cursor cursor = databaseOperations.getInformations(db); 
       contactAdapter = new ContactAdapter(ctx, R.layout.display_contact_row); 
       String cFamName, cFirName, cTelNo; 
       while(cursor.moveToNext()){ 
        cFamName = cursor.getString(cursor.getColumnIndex(TableData.TableInfo.eeFamName)); 
        cFirName = cursor.getString(cursor.getColumnIndex(TableData.TableInfo.eeFirName)); 
        cTelNo = cursor.getString(cursor.getColumnIndex(TableData.TableInfo.eeTelNo)); 
        Contact contact = new Contact(cFamName, cFirName, cTelNo); 
        publishProgress(contact); 
       } 
       return "get_info"; 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if(result.equals("get_info")){ 
      listView.setAdapter(contactAdapter); 
     } 
     else{ 
      Toast.makeText(ctx, result, Toast.LENGTH_LONG).show(); 
     }  
    } 
} 

這裏是顯示聯繫人的DisplayContact代碼,該聯繫人稱爲backgroudTask來顯示列表。

package com.example.assignment; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class DisplayContact extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.display_contact); 
     BackgroundTask backgroundTask = new BackgroundTask(this); 
     backgroundTask.execute("get_info"); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.display_contact, menu); 
     return true; 
    } 

} 

這裏是我的contactAdaper

package com.example.assignment; 

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

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

public class ContactAdapter extends ArrayAdapter<Object> { 

    List<Contact> list = new ArrayList<Contact>(); 

    public ContactAdapter(Context context, int resource) { 
     super(context, resource); 
     // TODO Auto-generated constructor stub 
    } 

    public void add(Contact object){ 
     list.add(object); 
     super.add(object); 
    } 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     View row = convertView; 
     ContactHolder contactHolder; 
     if(row==null){ 
      LayoutInflater layoutInflater =(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.display_contact_row,parent,false); 
      contactHolder = new ContactHolder(); 
      contactHolder.name = (TextView)row.findViewById(R.id.name); 
      contactHolder.number = (TextView)row.findViewById(R.id.number); 
      row.setTag(contactHolder); 
     } 
     else{ 
      contactHolder = (ContactHolder)row.getTag(); 
     } 

     Contact contact = (Contact)getItem(position); 
     contactHolder.name.setText(contact.getName().toString()); 
     contactHolder.number.setText(contact.getTelNo().toString()); 
    return row; 
    } 

    static class ContactHolder{ 
     TextView name, number; 
    } 

} 
+0

Click是UI的一部分,因此它應該位於實現偵聽器的Activity/Fragment或附加到偵聽器中的獨立偵聽器中。我認爲你的問題是你正在嘗試創建UI onResponse。更好的方法是直接創建UI,只需填寫由asyncTask收到的數據即可。 – Fusselchen

回答

0

這取決於你需要的代碼。

如果您只需要在一個活動/片段中,請將其放入該活動/片段中。如果您需要將其用於多個領域,最好的方法是在您複製的對象上實現一個函數(fragment?custom object?task?),並在執行單擊操作時使用適當的參數調用該函數。

例如,您可以讓您的asyncTask擴展「OnClickListener」,並使用button.setOnClickListener(asyncTask);。 如果您需要更多的參數,你可以在你的AsyncTask像「doOnClick(查看視圖,參數1,參數2 ......)」,然後使用匿名onClickListener有一個函數:

button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     asyncTask.doOnClick(view, param1, param2, ...); 
    } 
}); 

的第一步是要了解你想要:本地代碼?可重複使用的一個?...然後實現將被複制(或在活動中)的功能。