Search code examples
androidlistview-adapter

when I press a button which exists inside the custom list view it deletes another row from the one that I want


I have created a custom list view adapter, which is like a table with rows and columns.

I have not fully understand yet, how getView method works.

the last colum of each row, I have placed a reject button. When I press this button, it deletes the specific row.

The problem is that it does not delete the row when I press, instead it deletes another row.

I quote the code of the custom adapter

public class ListViewAdapter extends BaseAdapter
{
    public final String TAG = getClass().getSimpleName();
    public ArrayList<HashMap<String, String>> list;
    Activity activity;
    TextView txtFirst;
    TextView txtSecond;
    TextView txtThird;
    TextView txtFourth;
    ImageView imgView;
    //Button btn_con;
    ImageView btn_con,btn_rej;
    Button btn_popup;
    PopupWindow m_popupWindow;
    private RelativeLayout m_relativeLayout;

    public ListViewAdapter(Activity activity, ArrayList<HashMap<String, String>> list)
    {
        super();
        this.activity = activity;
        this.list = list;
    }

    @Override
    public int getCount()
    {
        // TODO Auto-generated method stub
        return list.size();
    }

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


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

    public void updateItem(JSONObject p_jsonObject)
    {
        Log.d(TAG,"update custom list view");
        String id_ka=null,sw_ka=null,hw_ka=null,battery_ka=null,sw_color=null;
        try
        {
            id_ka = p_jsonObject.getString("id_ka");
            sw_ka = p_jsonObject.getJSONObject("sw_ka").getString("version");
            sw_color = p_jsonObject.getJSONObject("sw_ka").getString("color");
            hw_ka = p_jsonObject.getJSONObject("hw_ka").getString("version");
            battery_ka = p_jsonObject.getJSONObject("battery_ka").getString("level");
        }
        catch (JSONException p_e)
        {
            p_e.printStackTrace();
        }
        for(int i=0;i<list.size();i++)
        {
            if(list.get(i).get("id").equals(id_ka))
            {
                list.get(i).put(SWVERSION,sw_ka);
                list.get(i).put(HWVERSION,hw_ka);
                list.get(i).put(BATTERY_LEVEL,battery_ka);
                list.get(i).put(SWVERSION_COLOR,sw_color);
            }
        }
    }

    public boolean checkIfIdExistsInList(JSONObject p_jsonObject)
    {
        if (list == null)
        {
            Log.d(TAG,"List has not created");
        }
        if(list.size()==0)
        {
            Log.d(TAG,"List has 0 elements");
            return false;
        }
        String id_ka = null;
        try
        {
            id_ka = p_jsonObject.getString("id_ka");
        }
        catch (JSONException p_e)
        {
            p_e.printStackTrace();
        }
        for(int i=0;i<list.size();i++)
        {
            if (list.get(i).get("id").equals(id_ka))
            {
                Log.d(TAG,"ka with id "+id_ka+" exists in the list");
                return true;
            }
        }
        Log.d(TAG,"ka with id " +id_ka+" does not exist in the list");
        return false;
    }


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

        final LayoutInflater inflater = activity.getLayoutInflater();

        if (convertView == null)
        {

            convertView = inflater.inflate(R.layout.column_row, (ViewGroup)null);
            m_relativeLayout = (RelativeLayout) convertView.findViewById(R.id.activity_main);

            txtFirst = (TextView) convertView.findViewById(R.id.ka_id);
            txtSecond = (TextView) convertView.findViewById(R.id.battery_volt);
            txtThird = (TextView) convertView.findViewById(R.id.sw_version);
            txtFourth = (TextView) convertView.findViewById(R.id.image);
            imgView = (ImageView)convertView.findViewById(R.id.imgView);
            btn_con = (ImageView)convertView.findViewById(R.id.btn_con);
            btn_rej = (ImageView)convertView.findViewById(R.id.btn_rej);
        }

        final HashMap<String, String> map = list.get(position);
        Log.d(TAG, map.get(KA_ID) + " updates UI in position " + String.valueOf(position));
        txtFirst.setText(map.get(KA_ID));
        txtSecond.setText(map.get(SWVERSION));
        txtSecond.setBackgroundColor(Color.parseColor(map.get(SWVERSION_COLOR)));
        txtThird.setText(map.get(HWVERSION));
        txtFourth.setText(map.get(BATTERY_LEVEL));
        btn_rej.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                list.remove(position);
                notifyDataSetChanged();

            }
        });
        return convertView;
    }

}

my main activity

public class MainActivity extends AppCompatActivity
{
    private final String TAG = getClass().getSimpleName();
    private ArrayList<HashMap<String,String>> list;
    private static int obj_id =0;
    Button bn;
    Handler resultHandler;
    DoSomethingThread randomWork;
    ListView lv,lv_header;
    ListViewAdapter customAdapter;
    LinearLayout ln;
    private String file_name = null;
    private String jsonobj = null;
    Random rand;
    Button btn_show,btn_update,btn_remove,btn_popup;
    JSONObject jobjDemo;
    PopupWindow m_popupWindow;
    LayoutInflater m_layoutInflater;
    RelativeLayout m_relativeLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.progressbar);
        setContentView(R.layout.activity_main);
        createButtons();
        lv = (ListView)findViewById(R.id.mainLV);
        list = new ArrayList<HashMap<String, String>>();


    }

    private void createButtons()
    {
        m_relativeLayout = (RelativeLayout) findViewById(R.id.activity_main);
        btn_popup = (Button)findViewById(R.id.btn_popup);
        btn_popup.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                m_layoutInflater = (LayoutInflater)getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
                ViewGroup container = (ViewGroup) m_layoutInflater.inflate(R.layout.popup,null);
                m_popupWindow = new PopupWindow(container,400,400,true);
                m_popupWindow.showAtLocation(m_relativeLayout, Gravity.NO_GRAVITY,500,500);

                container.setOnTouchListener((
                        new View.OnTouchListener()
                        {
                            @Override
                            public boolean onTouch(View v, MotionEvent event)
                            {
                                m_popupWindow.dismiss();
                                return true;
                            }
                        }));


            }
        });
        btn_show = (Button) findViewById(R.id.btn_show);
        btn_show.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                boolean id_exist = false;
                if(customAdapter != null)
                {
                    id_exist = customAdapter.checkIfIdExistsInList(jobjDemo);
                }
                if(id_exist)
                {
                    Log.d(TAG,"id exists in list view, updating...");
                    updateListView(jobjDemo);
                }
                else
                {
                    Log.d(TAG,"id does not exist in list view, add element...");
                    startGenerating(jobjDemo);
                }

            }
        });
        btn_update = (Button)findViewById(R.id.btn_update);
        btn_update.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Log.d(TAG,"JSON file has been updated");
                String json_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath();
                jobjDemo = getJSonFromFile(json_path+"/test.json");
            }
        });
        btn_remove = (Button)findViewById(R.id.btn_remove);
        btn_remove.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Log.d(TAG,"remove element from custom list view");
            }
        });
    }



    private void updateListView(JSONObject p_jsonObject)
    {
        if (lv.getAdapter()== null)
        {
            Log.d(TAG,"ListView has not created yet");
            return;

        }
        if (lv.getAdapter().getCount() == 0)
        {
            Log.d(TAG, "ListView has 0 elements");
            return;
        }
        customAdapter.updateItem(p_jsonObject);
        customAdapter.notifyDataSetChanged();
        lv.setAdapter(customAdapter);

    }


    private void startGenerating(JSONObject p_jsonObject)
    {
        String id_ka=null,sw_ka=null,hw_ka=null,battery_ka=null,sw_color=null;
        getWindow().getDecorView().getRootView().findViewById(R.id.list_headers).setVisibility(LinearLayout.VISIBLE);
        try
        {
            id_ka = p_jsonObject.getString("id_ka");
            sw_ka = p_jsonObject.getJSONObject("sw_ka").getString("version");
            sw_color = p_jsonObject.getJSONObject("sw_ka").getString("color");
            hw_ka = p_jsonObject.getJSONObject("hw_ka").getString("version");
            battery_ka = p_jsonObject.getJSONObject("battery_ka").getString("level");
        }
        catch (JSONException p_e)
        {
            p_e.printStackTrace();
        }
        HashMap<String,String> temp = new HashMap<String,String>();
        temp.put(KA_ID,id_ka);
        temp.put(SWVERSION,sw_ka);
        temp.put(SWVERSION_COLOR,sw_color);
        temp.put(HWVERSION,hw_ka);
        temp.put(BATTERY_LEVEL,battery_ka);
        list.add(temp);
        customAdapter=new ListViewAdapter(this, list);
        lv.setAdapter(customAdapter);
    }



    @Override
    public void onResume()
    {
        super.onResume();
        Log.d(TAG,"Data has changed");
    }


}

What I have done so far and it is working but I am not sure that this is the right implementation is to make public and static the custom adapter and use the same object inside custom adapter.

Any suggestions, thanks for your help!


Solution

  • try this one

    Create new Interface name DeleteRow like this :

    public interface DeleteRow {
    void deleteRow(int position);
    }
    

    In your MainActivity add

    implements DeleteRow
    

    Like this

    public class MainActivity extends AppCompatActivity implements DeleteRow{
    // your class
    
    @Override
    public void deleteRow(int position) {
        list.remove(position);
        listView.removeViewAt(position);
        listViewAdapter.notifyItemRemoved(position);
        listViewAdapter.notifyItemRangeChanged(position, list.size());
    }
    }
    

    add this parameter to your adapter

    customAdapter = new ListViewAdapter(... , this);
    

    In ListViewAdapter add

    DeleteRow deleterow;
    
    public ListViewAdapter(Activity activity, ArrayList<HashMap<String, String>> list, DeleteRow deleterow)
    {
        super();
        this.activity = activity;
        this.list = list;
        this.deleterow = deleterow;
    }
    

    in the clickListener

     btn_remove.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                deleteRow.deleteRow(position);
                Log.d(TAG,"remove element from custom list view");
            }
        });