2016-11-17 15 views
1

Я создал пользовательский адаптер представления списка, который похож на таблицу со строками и столбцами.Когда я нажимаю кнопку, которая существует внутри пользовательского списка, она удаляет другую строку из той, которая мне нужна

Я еще не совсем понял, как работает метод getView.

последний колометр каждой строки, я поместил кнопку отклонения. Когда я нажимаю эту кнопку, она удаляет определенную строку.

Проблема заключается в том, что она не удаляет строку при нажатии, вместо этого удаляет другую строку.

Привожу код пользовательского адаптера

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; 
    } 

} 

моей основной деятельности

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"); 
    } 


} 

То, что я сделал до сих пор, и она работает, но я не уверен, что это правильное выполнение состоит в том, чтобы сделать общедоступным и статическим пользовательский адаптер и использовать тот же объект внутри пользовательского адаптера.

Любые предложения, спасибо за помощь!

+0

Здесь размещается весь код.Как кто-то может знать, где вы использовали статические и публичные! – AndiGeeky

ответ

2

попробовать это один

Создать новое имя интерфейса DeleteRow так:

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

В вашей MainActivity добавить

implements DeleteRow 

Как это

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()); 
} 
} 

добавить этот параметр в адаптере

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

В ListViewAdapter добавить

DeleteRow deleterow; 

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

в 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"); 
     } 
    }); 
+0

вышеперечисленное исключает следующее исключение java.lang.UnsupportedOperationException: removeViewAt (int) не поддерживается в AdapterView – KostasA

+0

О, Извините, что для RecyclerView просто удалите эту строку listView.removeViewAt (должность); –

+0

спасибо, что это работает, но я немного поменял код в deleteRow @Override public void deleteRow (int position) { list.remove (position); customAdapter.notifyDataSetChanged(); lv.setAdapter (customAdapter); } согласны ли вы с этим изменением? – KostasA

-1

Вы можете попробовать следующий код

list.remove(position + 1); 
notifyDataSetChanged(); 
+0

Я пробовал, что, но не работает. Когда я нажимаю кнопку первой строки, она удаляет вторую строку, а затем я нажимаю кнопку отклонения оставшейся строки, приложение разбилось. – KostasA

1

попробовать это

@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.setTag(position); 
     btn_rej.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       int rposition=v.getTag(); 
       list.remove(rposition); 
       notifyDataSetChanged(); 

      } 
     }); 
     return convertView; 
    } 
+0

Я получаю ошибку времени выполнения, nullpointerexception, в строке, которая включает в себя v.getTag – KostasA

+0

Позвольте мне посмотреть ваш logcat – manichandra

+0

извините, моя ошибка, я забыл добавить одну строку. Теперь приложение не сбой, но у меня такая же проблема, что он удаляет другую строку из той, которую я выбрал. – KostasA

0

все перечисленные выше решения не работают. Вместо если я поверну customAdapter и ЛВ общественности и статические в Mainactivity

public static ListView lv; 
public static ListViewAdapter customAdapter; 

и на Изнутри ListViewAdapter

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

       list.remove(position); 
       customAdapter.notifyDataSetChanged(); 
       lv.setAdapter(customAdapter); 

      } 
     }); 

это будет делать эту работу. Но, как я сказал, я не знаю, правильно ли это.