Android 4.4.2:在Fragment中使用Listview和combobox

时间:2014-06-21 08:01:08

标签: android android-fragments android-listview

我在这样的片段中有一个列表视图: enter image description here

“联系人”部分显示用户联系人,“组”部分显示用户组。他们俩都在使用碎片。我已经能够为他们实现自定义列表视图。用于填充联系人部分列表视图的contactadaptor代码如下:

package com.project.iandwe.Adaptor;

import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import com.project.iandwe.Data.ContactData;
import com.project.iandwe.R;

import java.util.ArrayList;

/**
 * Created by NathanDrake on 6/4/2014.
 */

public class ContactSelectAdaptor extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {

    ArrayList<ContactData> listViewRows;
    Context context;
    public SparseBooleanArray checkboxState;

 public ContactSelectAdaptor(Context context){

        //Resources resources = context.getResources();
        this.context =context;
        UserDatabaseAdapter userDatabaseAdapter = new UserDatabaseAdapter(context);
        Cursor cursor = userDatabaseAdapter.getUserContacts();
        listViewRows = new ArrayList<ContactData>();
        checkboxState = new SparseBooleanArray();
        while (cursor.moveToNext()){
         //   ContactData listViewRow = new ListViewRow();
             String contact_id = cursor.getString(0);
            String first_name = cursor.getString(1);
          String last_name = cursor.getString(2);
            String email = cursor.getString(3);
           String icon = cursor.getString(4);

          //  Log.d("ContactSelectAdaptor"," " + contact_id + " " + first_name + " " + last_name+ " " + email);

            if (last_name == null){
                last_name = " ";
            }

            listViewRows.add(new ContactData(contact_id,first_name,last_name,email,icon));
        }
        cursor.close();
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

         View row = convertView;
         ViewClass viewClass = null;

        if (row==null) {
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.listview_contact_select, parent, false);
            viewClass = new ViewClass(row);
            row.setTag(viewClass);
        }

        else {

            viewClass = (ViewClass) row.getTag();
        }
       /* ImageView imageView = (ImageView) view.findViewById(R.id.imageViewProfile);
        TextView textViewName = (TextView) view.findViewById(R.id.textViewDisplayName);
        TextView textViewEmail = (TextView) view.findViewById(R.id.textViewEmailAddress);
        CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBoxSelected);
        */
        ContactData contactData = listViewRows.get(position);

        Uri uri = contactData.getIcon();
        if (uri!=null){ viewClass.imageView.setImageURI(uri); }
        else { viewClass.imageView.setImageResource(R.drawable.ic_contacts); }

        viewClass.textViewName.setText(contactData.getFirst_name());
        viewClass.textViewEmail.setText(contactData.getEmail());
        viewClass.checkBox.setTag(position);
        viewClass.checkBox.setChecked(checkboxState.get(position,false));
        viewClass.checkBox.setOnCheckedChangeListener(this);

        return row;
    }


    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        checkboxState.put((Integer) buttonView.getTag(), isChecked);
    }

    class ViewClass {
        ImageView imageView;
        TextView textViewName;
        TextView textViewEmail;
        CheckBox checkBox;

        ViewClass (View view){

            imageView = (ImageView) view.findViewById(R.id.imageViewProfile);
             textViewName = (TextView) view.findViewById(R.id.textViewDisplayName);
            textViewEmail = (TextView) view.findViewById(R.id.textViewEmailAddress);
             checkBox = (CheckBox) view.findViewById(R.id.checkBoxSelected);

        }
    }
}

这是我尝试选择用户选择的联系人的方式:

package com.project.iandwe.Menu;


import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import com.project.iandwe.Adaptor.ContactSelectAdaptor;
import com.project.iandwe.Adaptor.UserDatabaseAdapter;
import com.project.iandwe.R;

import java.util.ArrayList;

/**
 * Created by NathanDrake on 5/4/2014.
 */
public class ContactsFragments extends Fragment {

    TextView textView;
    ListView listView;
    String eventId;

    public ContactsFragments(){}

    public ContactsFragments (String eventID){
        this.eventId=eventID;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
      return   inflater.inflate(R.layout.fragment_contact,container, false );
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        UserDatabaseAdapter userDatabaseAdapter = new UserDatabaseAdapter(getActivity());
        //textView = (TextView) getActivity().findViewById(R.id.textViewSample);
       // textView.setText(userDatabaseAdapter.getUserContacts());
        listView = (ListView) getActivity().findViewById(R.id.listViewContacts);
        ContactSelectAdaptor contactSelectAdaptor = new ContactSelectAdaptor(getActivity());
        listView.setAdapter(contactSelectAdaptor);
        listView.setVisibility(View.VISIBLE);

        /* Checking who all customers have been invited to the events
        * http://stackoverflow.com/questions/18162931/get-selected-item-using-checkbox-in-listview */
        Cursor cursor = userDatabaseAdapter.getUserContacts();
        cursor.moveToFirst();

        for (int i=0; i<contactSelectAdaptor.checkboxState.size();i++){

            if (contactSelectAdaptor.checkboxState.get(i)==true){
                String contact_id = cursor.getString(0);
                String first_name = cursor.getString(1);
                String last_name = cursor.getString(2);
                String email = cursor.getString(3);
                //String icon = cursor.getString(4);
               long id = userDatabaseAdapter.insertUserInvite(eventId,contact_id,email,first_name,last_name,0,0,0,0);
               if (id<0){
                   Log.e("UserEventContactInsert","Failure");
               }
            }

            cursor.moveToNext();
        }

        cursor.close();

    }


}

我是Android的新手,我不确定上面的代码是否应该检查用户选择的复选框应该在片段的哪个部分完成?如果用户选择了右上角显示的Done菜单,我真的想填充这些数据但是我发现很难将稀疏的布尔数组从片段用于活动。有没有办法可以实现这个目标?

为主活动添加具有“完成”菜单按钮的代码:

package com.project.iandwe;


import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import com.project.iandwe.Adaptor.FragmentContactAdaptor;
import com.project.iandwe.Adaptor.UserDatabaseAdapter;

/**
 * Created by NathanDrake on 5/21/2014.
 */
public class AddContacts extends FragmentActivity {

    ViewPager viewPager = null;
    String name;
    String eventId,description,date, time, location;

    protected void  onCreate( Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_contacts);
        viewPager = (ViewPager) findViewById(R.id.pager_contacts);

        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new FragmentContactAdaptor(fragmentManager));
        //viewPager.setCurrentItem(1);
        Intent intent = getIntent();
        eventId = intent.getExtras().getString("eventId");
        name = intent.getExtras().getString("name");
        description = intent.getExtras().getString("description");
        date = intent.getExtras().getString("date");
        time = intent.getExtras().getString("time");
        location = intent.getExtras().getString("location");


    }

    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.add_event_finish,menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.action_finish:
                //UserDatabaseAdapter userDatabaseAdapter = new UserDatabaseAdapter(this);
                //long id =   userDatabaseAdapter.insertUserEvent(name,description,date,time,location);
                 //if (id>0 ) {
                 Toast.makeText(this,"Event successfully Created",Toast.LENGTH_LONG).show();
                 Intent intent = new Intent(this, HomePage.class);
                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                 startActivity(intent);
                 finish();
                // }
                return true;
            default:
            return super.onOptionsItemSelected(item);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在菜单完成处理程序中尝试以这种方式获取适配器:

ContactsFragments fragment = (ContactsFragments) getSupportFragmentManager()
                    .findFragmentByTag("ContactsFragments");

ListView listView = fragment.listView;

ContactSelectAdaptor adapter = (ContactSelectAdaptor)listView.getAdaptor();

如果你有适配器,那么你的sparseb布尔数组是可见的。