放置可点击列表查看代码的合适页面在哪里
Posted
技术标签:
【中文标题】放置可点击列表查看代码的合适页面在哪里【英文标题】:where is the suitable page to place the clickable listView code 【发布时间】:2017-08-16 04:40:50 【问题描述】:首先,我想通知我,我正在创建一个允许用户通过使用 sqlite 来存储数据来查看和注册联系人的 android 应用程序 而且,我使用 AsyncTask 来执行插入和查看数据。 现在,我想知道我应该在哪里编写可点击的视图列表代码。 应该写在backgroudTask还是displaycontact页面? 有人可以提供一些如何植入它的例子吗? 这是示例代码和一些解释。 这是背景任务。
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;
这是我的联系人Adaper
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;
【问题讨论】:
点击是 UI 的一部分,因此它应该在您的 Activity/Fragment 中实现侦听器或附加到它的单独侦听器。我认为您的问题是您正在尝试创建 UI onResponse。更好的方法是直接创建 UI,只需填写 asyncTask 收到的数据即可。 【参考方案1】:这取决于您需要该代码的位置。
如果您只在一个活动/片段中需要它,请将其放入该活动/片段中。如果您在许多领域都需要它,最好的方法是在您复制的对象(片段?自定义对象?任务?)上实现一个函数,并在执行点击时使用适当的参数调用该函数。
例如,您可以让您的 asyncTask 扩展“OnClickListener”,并使用button.setOnClickListener(asyncTask);
。
如果您需要更多参数,您可以在 asyncTask 中有一个函数,例如“doOnClick(View view, param1, param2 ...)”,然后使用匿名 onClickListener:
button.setOnClickListener(new OnClickListener()
@Override
public void onClick(View view)
asyncTask.doOnClick(view, param1, param2, ...);
);
您的第一步是了解您想要什么:本地代码?可重复使用的?...然后在将要复制的内容(或在活动中)实现该功能。
【讨论】:
以上是关于放置可点击列表查看代码的合适页面在哪里的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里放置一个代码,当提交表单时,它将重定向到另一个页面? [复制]