Android ListView多个数组,带有自定义适配器

时间:2015-07-18 16:28:43

标签: android arrays listview android-listview

我从数据库中提取了几个json数组,这些是数组(Name =名称列表,地址=整数列表)并托管在DialerFragment中:

String[] contactNameArray= LoginHandler.getMyName();
String[] contactAddressArray= LoginHandler.getMyContactsAddress();
ListAdapter contactadapter = new ContactsAdapter(getActivity(), contactNameArray);
ListView contactsListView = (ListView) view.findViewById(R.id.contact_list);    
contactsListView.setAdapter(contactadapter);

这是我的ContactsAdapter:

public class ContactsAdapter extends ArrayAdapter<String>{
private static final String TAG = "ContactsListAdapter";


public ContactsAdapter(Context context, String[] values){
    super(context, R.layout.contact_row_layout,  values);
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
    Log.d(TAG, "getView");
    // The LayoutInflator puts a layout into the right View
    LayoutInflater inflater = LayoutInflater.from(getContext());
    // inflate takes the resource to load, the parent that the resource may be
    // loaded into and true or false if we are loading into a parent view.
    View view = inflater.inflate(R.layout.contact_row_layout, parent, false);
    // We retrieve the text from the array
    String contact = getItem(position);
    // Get the TextView we want to edit
    TextView mContactName = (TextView)view.findViewById(R.id.contact_name);
    view.findViewById(R.id.contacts_avatar);

    // Put the next TV Show into the TextView
    mContactName.setText(contact);

    return view;
}}

此外,在我的DialerFragment中,我有以下代码:

private final View.OnClickListener mOnMakeCallClick = new OnClickListener(){
    public void onClick(final View view){
        String numberToCall = "2";
        if (!TextUtils.isEmpty(numberToCall)){
            mCallWithVideo = view.getId() == R.id.contact_videocall;
            Log.d(TAG, "make call clicked: " + numberToCall + ", video=" + (mCallWithVideo ? "true" : "false"));
            mCallInitiated = ((Main)getActivity()).makeCall(numberToCall, mCallWithVideo);
            mTelNumberView.setText("");
        }
    }
};

我有ListView(fragment_dialer.xml)和行模板(contact_row_layout.xml)。

当前代码没有任何错误,使用我在数据库中的联系人填充ListView。

问题: 我需要根据单击的ImageButton动态调用联系人。即如何将1个名称数组与1个地址数组匹配,然后将该地址传递到OnCallClick以启动呼叫? 如果我可以为ImageButton分配一个值(就像你在PHP中做类似的事情那样)然后调用&#34; value&#34;那将是很好的。在contactsadapter中。

我真的非常坚持这一点,任何帮助都会非常感激。我对Android也很陌生。

解决方案: DialerFragment:

ListView contactsListView = (ListView) view.findViewById(R.id.contact_list);
contactsListView.setAdapter(new ContactsBaseAdapter(getActivity()));

然后我的&#34;单行&#34;类:

class SingleRow{
String name;
String address;

SingleRow(String name, String address){
    this.name=name;
    this.address=address;
}}

然后我的&#34;联系基地适配器&#34;:

public class ContactsBaseAdapter extends BaseAdapter{
private static final String TAG = "CONTACTS_BASE_ADAPTER";
ArrayList<SingleRow> list;
Context context;
ContactsBaseAdapter(Context c){
    list = new ArrayList<SingleRow>();
    context = c;
    String[] contactNameArray= LoginHandler.getMyName();
    String[] contactAddressArray= LoginHandler.getMyContactsAddress();

    for(int i= 0; i< contactNameArray.length; i++){
        list.add(new SingleRow(contactNameArray[i], contactAddressArray[i]));
    }
}
@Override
public int getCount() {
    return list.size();
}
@Override
public Object getItem(int i) {
    return list.get(i);
}
@Override
public long getItemId(int i) {
    return i;
}
@Override
public View getView(int i, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) 
    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View row = inflater.inflate(R.layout.contact_row_layout,parent, false);

    ImageView mContactPresence = (ImageView)row.findViewById(R.id.contacts_avatar);
    TextView mContactName = (TextView)row.findViewById(R.id.contact_name);
    TextView mContactAddress = (TextView)row.findViewById(R.id.contact_number);

    SingleRow contactrow = list.get(i);

    mContactName.setText(contactrow.name);
    mContactAddress.setText(contactrow.address);
    Drawable drawable = null;
    mContactPresence.setImageDrawable(drawable);

    return row;
}}

备注: 你是对的,谢谢你。我的问题是我对这种编程完全不熟悉。我之前做过OOP,但只在PHP中做过,并且不知道如何在android中操作数据。对所有指出我正确方向的人表示赞赏,我学到了很多东西!另外,找到了这个youtube视频播放列表,帮助我理解了listviews和适配器等的许多基础知识。

下一步: 我将查看ViewHolders和RecyclerViews以优化代码:)。并将数据与在线状态一起传递给呼叫处理程序!!

2 个答案:

答案 0 :(得分:3)

因此,创建名为Contact的对象,添加属性,然后在适配器布局中添加所需的TextView,并在设置数字,名称等时调用它们。请看下面。

public class ContactsAdapter extends ArrayAdapter {     private static final String TAG =“ContactsListAdapter”;

add

答案 1 :(得分:2)

我建议您制作一个新对象(联系人)的新数组,您可以从现有的contactNameArray&amp; contactAddressArray数组。

    Contact {
        public String name;
        public String address;
    }

您可以将此数组传递给ContactsAdapter。

在AdapterView.onItemClick的实现中,您只需调用

    contactadapter.getItem(position);

为了使您的Contact对象与单击的行相关联。

作为补充说明,我强烈建议在getView(https://www.codeofaninja.com/2013/09/android-viewholder-pattern-example.html)中实现静态ViewHolder模式。