Search code examples
androidandroid-layoutlistviewlistviewitem

How to select two list items at same time ? To be specific ONLY TWO items not more than that


I have a list view like the below image.

enter image description here

Now I want to select Only Any two items from the list view at a time and pass the values of both listview items with Intent to next activity. How can I achieve it.?

If Both items are not selected set validation on it?

AdapterClass

public class LoadAdapter extends BaseAdapter {
    private ArrayList<DataBase> mProductItems;
    private LayoutInflater mLayoutInflater;
    private Context mContext;
    DBHelper mydb;
    DataBase stringItem;
    public LoadAdapter(Context context, ArrayList<DataBase> arrayList){
        mContext = context;
        mProductItems = arrayList;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        Log.e("testtt", String.valueOf(mProductItems.size()));
        return mProductItems.size();

    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }



    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mLayoutInflater.inflate(R.layout.load_chart_item, parent, false);
            holder.txtv_name = (TextView) convertView.findViewById(R.id.text);
            holder.nameid = (TextView) convertView.findViewById(R.id.nameid);
            holder.btn_delete = (Button) convertView.findViewById(R.id.btn_delete);
            holder.btn_edit = (Button)convertView.findViewById(R.id.btn_edit);
            holder.location = (TextView)convertView.findViewById(R.id.loc);
            holder.img= (ImageView)convertView.findViewById(R.id.img);
            holder.btn_delete.setTag(position);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        mydb = new DBHelper(mContext);

         stringItem = mProductItems.get(position);

        if (stringItem != null) {
            if (holder.txtv_name != null) {

                holder.txtv_name.setText(stringItem.getName());
                holder.nameid.setText(stringItem.getId());
                holder.location.setText(stringItem.getLocation());
                Log.e("saved Location  values",stringItem.getLocation());
            }
        }


 if(selected.get(position))
    {
        //for selected row
        holder.img.setBackgroundResource(R.drawble.myimg)
    }
    else
    {
        // for not selected row

    }


        holder.btn_delete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                DataBase test = mProductItems.get(position);
                String id =  test.getId();

                mydb.deleteContact(Integer.valueOf(id));
                mProductItems.remove(mProductItems.get(position));
                LoadAdapter.this.notifyDataSetChanged();


                if (mProductItems.size() == 0){
                    mProductItems.clear();
                    LoadAdapter.this.notifyDataSetChanged();
                }



            }
        });




        Log.e("DataBase", String.valueOf(mydb.getAllCotacts()));

        holder.btn_edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(mContext,UpdateData.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                SharedPreferences preff = PreferenceManager.getDefaultSharedPreferences(mContext);
                SharedPreferences.Editor edi = preff.edit();
                edi.putString("key",String.valueOf(position+1));
                edi.apply();

                mContext.startActivity(intent);
            }
        });

              return convertView;
    }

    public void refresh(ArrayList<DataBase> items)
    {
        this.mProductItems = items;
        notifyDataSetChanged();
    }


    private static class ViewHolder {
        ImageView img;
        TextView txtv_name,nameid,location;
        Button btn_delete,btn_edit;
    }
}

Main Class

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;


public class LoadChart extends AppCompatActivity {
    public final static String EXTRA_MESSAGE = "MESSAGE";
    private SwipeListView listView;
    DBHelper mydb;
    Button det;
    LoadAdapter loadAdapter;
    ArrayList<DataBase> array_list;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.load_chart);


         mydb = new DBHelper(this);
         array_list = mydb.getAllCotacts();
        Log.e("logging", String.valueOf(array_list));
     //   ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,R.layout.load_chart_item,R.id.text, array_list);

          det = (Button)findViewById(R.id.reli);

        listView = (SwipeListView) findViewById(R.id.listview);
        listView.setAdapter(new LoadAdapter(getApplicationContext(),array_list));


        det.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String str = "";
            str =  relationAdapter.getSelected();
            Toast.makeText(RelationShipChartList.this, str, Toast.LENGTH_SHORT).show();

        }
    });


        listView.setSwipeListViewListener(new BaseSwipeListViewListener() {
            int openItem = -1;
            int lastOpenedItem = -1;
            int lastClosedItem = -1;

            @Override
            public void onOpened(int position, boolean toRight) {
                lastOpenedItem = position;

                int index = position - listView.getFirstVisiblePosition();
                View view = listView.getChildAt(index);
                Button delete = (Button) view.findViewById(R.id.btn_delete);
                Button edit = (Button) view.findViewById(R.id.btn_edit);

               if (!toRight) {

                    delete.setVisibility(View.VISIBLE);
                    edit.setVisibility(View.VISIBLE);

                }


                if (openItem > -1 && lastOpenedItem != lastClosedItem) {
                    listView.closeAnimate(openItem);


                }
                openItem = position;
            }


            @Override
            public void onStartClose(int position, boolean right) {
                Log.d("swipe", String.format("onStartClose %d", position));
                lastClosedItem = position;

            }

            @Override
            public void onClosed(int position, boolean fromRight) {

                int index = position - listView.getFirstVisiblePosition();
                View view = listView.getChildAt(index);
                Button delete = (Button) view.findViewById(R.id.btn_delete);
                Button edit = (Button) view.findViewById(R.id.btn_edit);



                if (!fromRight) {

                    delete.setVisibility(View.INVISIBLE);
                    edit.setVisibility(View.INVISIBLE);

                }

            }

            @Override
            public void onListChanged() {

            }

            @Override
            public void onMove(int position, float x) {

            }

            @Override
            public void onStartOpen(int position, int action, boolean right) {
            }

            @Override
            public void onClickFrontView(int position) {

                int id_To_Search = position;

                DataBase test = array_list.get(position);
                String id =  test.getId();
                String name = test.getName();
                String loc = test.getLocation();
                String dt = test.getDate();
                String time = test.getTime();

                Bundle dataBundle = new Bundle();
                dataBundle.putString("name",name);
                dataBundle.putString("date",dt);
                dataBundle.putString("time",time);
                dataBundle.putString("location",loc);
                dataBundle.putInt("id", Integer.parseInt(id));
                Intent intent = new Intent(getApplicationContext(),LoadedChart.class);
                intent.putExtras(dataBundle);
                startActivity(intent);

            }

            @Override
            public void onClickBackView(int position) {

                Log.e("swipe", String.format("onClickBackView %d", position));
            }

            @Override
            public void onDismiss(int[] reverseSortedPositions) {

            }

        });
    }

    public int convertDpToPixel(float dp) {
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        float px = dp * (metrics.densityDpi / 160f);
        return (int) px;
    }
    @Override
    public void onResume()
    {
        super.onResume();
        Set_Referash_Data();

    }


    public void Set_Referash_Data() {
        array_list.clear();
        mydb = new DBHelper(this);

        ArrayList<DataBase> con = mydb.getAllCotacts();

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

            String  tidno = con.get(i).getId();
            String name = con.get(i).getName();
            String cons = con.get(i).getCon();
            String loc = con.get(i).getLocation();
            DataBase cnt = new DataBase();
            cnt.setId(tidno);
            cnt.setName(name);
            cnt.setCon(cons);
            cnt.setLocation(loc);
            array_list.add(cnt);

            Log.e(String.valueOf(array_list),"RefreshData");

        }
        mydb.close();


        array_list = mydb.getAllCotacts(); //reload the items from database
        LoadAdapter ld = new LoadAdapter(getApplicationContext(),array_list);
        listView.setAdapter(ld);
        ld.refresh(array_list);
        ld.notifyDataSetChanged();
        Log.e(String.valueOf(array_list),"RefreshData Final");
    }

}

Logcat

05-09 14:47:50.706 29939-29939/com.example.user.humandesignsample E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.example.user.humandesignsample, PID: 29939
                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.user.humandesignsample.RelationAdapter.getSelected()' on a null object reference
                                                                                        at com.example.user.humandesignsample.RelationShipChartList$1.onClick(RelationShipChartList.java:45)
                                                                                        at android.view.View.performClick(View.java:5204)
                                                                                        at android.view.View$PerformClick.run(View.java:21153)
                                                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                        at android.os.Looper.loop(Looper.java:148)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Solution

  • You can simply put a counter on item selection.

    Take a variable say for ex.

    int count = 0;
    

    Check this variable before marking item as selected/deselected:

    if(item.isSelected())
    {
       // you need to make is disable
       if(count>0)
       {
          count--;
          // // mark item as deselected
       }
    }
    else
    {
       // make it selected
         if(count<2)
         {
            count++;
            // mark item as selected
         }
    }
    

    This will make you select ONLY TWO items at a time.

    Modify your adapter like this:

    public class LoadAdapter extends BaseAdapter {
    private ArrayList<DataBase> mProductItems;
    private LayoutInflater mLayoutInflater;
    private Context mContext;
    DBHelper mydb;
    DataBase stringItem;
    ArrayList<Boolean> selected = new ArrayList<>();
    private int count=0;
    
    public LoadAdapter(Context context, ArrayList<DataBase> arrayList){
        mContext = context;
        mProductItems = arrayList;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        for (int i = 0; i < arrayList.size(); i++) {
    
            selected.add(false);
    
        }
    }
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        Log.e("testtt", String.valueOf(mProductItems.size()));
        return mProductItems.size();
    
    }
    
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }
    
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    
    
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder holder;
    
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mLayoutInflater.inflate(R.layout.load_chart_item, parent, false);
            holder.txtv_name = (TextView) convertView.findViewById(R.id.text);
            holder.nameid = (TextView) convertView.findViewById(R.id.nameid);
            holder.btn_delete = (Button) convertView.findViewById(R.id.btn_delete);
            holder.btn_edit = (Button)convertView.findViewById(R.id.btn_edit);
            holder.location = (TextView)convertView.findViewById(R.id.loc);
            holder.btn_delete.setTag(position);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
    
        mydb = new DBHelper(mContext);
    
        stringItem = mProductItems.get(position);
    
        if (stringItem != null) {
            if (holder.txtv_name != null) {
    
                holder.txtv_name.setText(stringItem.getName());
                holder.nameid.setText(stringItem.getId());
                holder.location.setText(stringItem.getLocation());
                Log.e("saved Location  values",stringItem.getLocation());
            }
        }
    
        if(selected.get(position))
        {
            //for selected row
            holder.txtv_name.setTextColor(color.red);
        }
        else
        {
            // for not selected row
            holder.txtv_name.setTextColor(color.black);
        }
    
        holder.txtv_name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                if(holder.txtv_name.getCurrentTextColor()== R.color.black)
                {
                    //is not selected
                    if(count<2)
                    {
                        count++;
                        selected.set(position,true);
    
                        // mark item as selected
                    }
                }
                else
                {
                    //is selected
                    if(count>0)
                    {
                        count--;
                        selected.set(position,false);
    
                        // // mark item as deselected
                    }
                }
                notifyDataSetChanged();
            }
        });
    
    
        holder.btn_delete.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
    
                DataBase test = mProductItems.get(position);
                String id =  test.getId();
    
                mydb.deleteContact(Integer.valueOf(id));
                mProductItems.remove(mProductItems.get(position));
                LoadAdapter.this.notifyDataSetChanged();
    
    
                if (mProductItems.size() == 0){
                    mProductItems.clear();
                    LoadAdapter.this.notifyDataSetChanged();
                }
    
    
    
            }
        });
    
    
    
    
        Log.e("DataBase", String.valueOf(mydb.getAllCotacts()));
    
        holder.btn_edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                Intent intent=new Intent(mContext,UpdateData.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
                SharedPreferences preff = PreferenceManager.getDefaultSharedPreferences(mContext);
                SharedPreferences.Editor edi = preff.edit();
                edi.putString("key",String.valueOf(position+1));
                edi.apply();
    
                mContext.startActivity(intent);
            }
        });
    
        return convertView;
    }
    
    public void refresh(ArrayList<DataBase> items)
    {
        this.mProductItems = items;
        notifyDataSetChanged();
    }
    
    
    private static class ViewHolder {
        TextView txtv_name,nameid,location;
        Button btn_delete,btn_edit;
    }}
    

    EDIT 2: For getting selected items from adapter define below method in adapter and call it with an adapter object like : adp.getSelected()

    public String getSelected() {
        String selectedString = "";
        int num=0;
        for (int i = 0; i < selected.size(); i++) {
            if (selected.get(i)) {
                num++;
                if (num == 1) {
                    selectedString = mProductItems.get(i).getName();
                } else {
                    selectedString += "," + mProductItems.get(i).getName();
                }
            }
        }
        return selectedString;
    }
    

    Answer to issue 2 : If you want to use ImageView instead of text color change. The do the same things as above but replace the TextView + Color with ImageView + Image.

    EDIT 3:

    You have called the getSelected() method from a Null object. Modify your code like this:

     listView = (SwipeListView) findViewById(R.id.listview);
     loadAdapter = new LoadAdapter(getApplicationContext(),array_list);
        listView.setAdapter(loadAdapter);
    
    
        det.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            String str = "";
            str =  loadAdapter.getSelected();
            Toast.makeText(RelationShipChartList.this, str, Toast.LENGTH_SHORT).show();
    
        }