放置可点击列表查看代码的合适页面在哪里

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, ...);
    
);

您的第一步是了解您想要什么:本地代码?可重复使用的?...然后在将要复制的内容(或在活动中)实现该功能。

【讨论】:

以上是关于放置可点击列表查看代码的合适页面在哪里的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里放置一个代码,当提交表单时,它将重定向到另一个页面? [复制]

微信小程序--仿京东UI样式顶部导航栏

如何在同一个页面里放置多个这样的图片轮播代码?(现在只有最上面的有轮播效果)

微信小程序(九)实现首页代码

没有密码,怎样查看到别人的QQ好友列表?

Angular 5 / 6. 我在哪里放置我的登录页面?