2016-08-18 5 views
0

Я пытаюсь обновить конкретный элемент в представлении списка без обновления всего списка (ясно объяснено ниже). Для этого требования я почти все под паром идеи, которые доступны в Интернете, но я не получил решенияОбновить определенный элемент в виде списка

Объяснение:

Я имел различные элементы в виде списка (см прикрепленного изображения). Для этого просмотра списка я храню идентификаторы и другие связанные данные, используя класс модели (класс POJO). В этом же проекте я использую push-уведомление. В этом push-уведомлении я получаю идентификатор элемента, который отображается в моем списке. В соответствии с id я должен показать некоторое изображение в виде списка. Для этого требования, если я обновляю весь вид списка, я могу изменить изображение, но не хочу обновлять весь список списка. Итак, я хочу изменить изображение перкулярного элемента в виде списка в соответствии с идентификатором, который я получаю от push-уведомления.

изображение

enter image description here

Пример кода (я использую парование пример кода для заполнения вид списка)

активность

public class EventMyEventHosting extends AppCompatActivity { 

    ArrayList<EventMyEventHostingItems> itemsaArrayList; 
    EventMyEventHostingAdapter2 itemsAdapter; 
    TextView tvNoEvents; 
    ListView listView; 
    boolean connection; 

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

     itemsaArrayList = new ArrayList<EventMyEventHostingItems>(); 
     itemsAdapter = new EventMyEventHostingAdapter2(EventMyEventHosting.this, R.layout.lv_my_events_hosting_adapter, itemsaArrayList); 
       // (EventMyEventHosting.this,itemsaArrayList); 
     listView = (ListView) findViewById(R.id.lv_events_my_event_hosting); 

     listView.setAdapter(itemsAdapter); 

     tvNoEvents = (TextView) findViewById(R.id.tv_events_my_event_hosting_no_events); 

     loadDetailsVolley(); 

     listView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 


        /*Intent intent = new Intent(EventMyEventHosting.this, EventMyEventDetail.class); 
        intent.putExtra("eventID", itemsaArrayList.get(position).getEventID()); 
        startActivity(intent);*/ 


      } 

     }); 
    } 



    public void loadDetailsVolley(){ 


     final ProgressDialog dialog = ProgressDialog.show(EventMyEventHosting.this, null, null); 
     ProgressBar spinner = new android.widget.ProgressBar(EventMyEventHosting.this, null, android.R.attr.progressBarStyle); 
     spinner.getIndeterminateDrawable().setColorFilter(Color.parseColor("#009689"), android.graphics.PorterDuff.Mode.SRC_IN); 
     dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
     dialog.setContentView(spinner); 
     dialog.setCancelable(false); 
     dialog.show(); 

     String eventMyEventHostingURL = "MyApi"; 
     Log.e("eventMyEventHostingURL", eventMyEventHostingURL); 

     StringRequest request = new StringRequest(Request.Method.POST, eventMyEventHostingURL, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 

       dialog.dismiss(); 

       if(response != null && !response.startsWith("<HTML>")){ 

        Log.e("eventHostingURLOnResponse", response); 

        try { 
         JSONArray jsonArray = new JSONArray(response); 

         if(jsonArray.length() > 0){ 

          for(int i = 0; i < jsonArray.length(); i++){ 
           JSONObject singleJsonObj = jsonArray.getJSONObject(i); 

           String postID = singleJsonObj.getString("id"); 
           String title = singleJsonObj.getString("name"); 
           String dateAndTime = singleJsonObj.getString("event_time"); 
           String address = singleJsonObj.getString("address"); 
           String isActive = singleJsonObj.getString("is_active"); 
           String bgImage = singleJsonObj.getJSONObject("event_cover").getString("url"); 

           EventMyEventHostingItems items = new EventMyEventHostingItems(); 

           items.setEventID(postID); 
           items.setIsActive(isActive); 
           items.setTitleMyEvent(title); 
           items.setTimeMyEvent(dateAndTime); 
           items.setLocationMyEvent(address); 
           items.setImageMyEvent(bgImage); 

           itemsaArrayList.add(items); 
           itemsAdapter.notifyDataSetChanged(); 
          } 

         }else { 
          tvNoEvents.setVisibility(View.VISIBLE); 
          listView.setVisibility(View.GONE); 
         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 


       }else{ 


        Toast.makeText(EventMyEventHosting.this, "Please check your Internet connection...",Toast.LENGTH_SHORT).show(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       dialog.dismiss(); 

       if(error != null){ 

        Log.e("error", error.toString()); 
       }else{ 


       } 
      } 
     }); 

     RequestQueue queue = Volley.newRequestQueue(EventMyEventHosting.this); 
     queue.add(request); 
     queue.getCache().remove(eventMyEventHostingURL); 

    } 
} 

адаптер

public class EventMyEventHostingAdapter2 extends ArrayAdapter<EventMyEventHostingItems> { 
    private Context context; 
    @SuppressWarnings("unused") 
    private List<EventMyEventHostingItems> items; 
    String eventIdForVol; 
    private EventMyEventHostingAdapter2 adapter; 

    /* 
    To remove item from list (Deleting the particular item) 

    items.remove(rowItem); 
    adapter.notifyDataSetChanged(); 

    // This is to show the no records found message 

    import static com.app.hire.MatchedCandidates.listView; 
    import static com.app.hire.MatchedCandidates.tvNoRecords; 

    if(items.size() == 0){ 
     listView.setVisibility(View.GONE); 
     tvNoRecords.setVisibility(View.VISIBLE); 
    } 
    */ 



    /* 
    (This is for calling the Activity or fragment method from adapter) 
    =================================================================== 

    http://stackoverflow.com/a/24502482 

    From your activity/Fragment initialize adapter like 
    --------------------------------------------------- 

    customAdapter = new CustomAdapter(myContext, android.R.layout.simple_list_item_1, getList, HomeFragment.this); //HomeFragment.this for fragment 

    In your adapter 
    -------------- 

    public CustomAdapter(Context context, int id, HomeFragment fragment) { 
    this.fragment = fragment; 
    } 

    method calling 
    -------------- 

    fragment.doSomething(); 
    */ 

    public EventMyEventHostingAdapter2(Context context, int resource) { 
     super(context, resource); 
     this.context = context; 
    } 

    public EventMyEventHostingAdapter2(Context context, int resource, int textViewResourceId) { 
     super(context, resource, textViewResourceId); 
     this.context = context; 
    } 

    public EventMyEventHostingAdapter2(Context context, int resource, EventMyEventHostingItems[] objects) { 
     super(context, resource, objects); 
     this.context = context; 
    } 

    public EventMyEventHostingAdapter2(Context context, int resource, int textViewResourceId, EventMyEventHostingItems[] objects) { 
     super(context, resource, textViewResourceId, objects); 
     this.context = context; 
    } 

    public EventMyEventHostingAdapter2(Context context, int resource, List<EventMyEventHostingItems> objects) { 
     super(context, resource, objects); 
     this.context = context; 
     this.items = objects; 
     this.adapter = this; 
    } 

    public EventMyEventHostingAdapter2(Context context, int resource, int textViewResourceId, List<EventMyEventHostingItems> objects) { 
     super(context, resource, textViewResourceId, objects); 
     this.context = context; 
     this.items = objects; 
     this.adapter = this; 
    } 

    @SuppressLint("InflateParams") @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     final EventMyEventHostingItems rowItem = getItem(position); 

     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null){ 
      convertView = mInflater.inflate(R.layout.lv_my_events_hosting_adapter, null); 
      holder = new ViewHolder(); 
      holder.eventImage = (ImageView) convertView.findViewById(R.id.iv_my_events_hosting_bg); 
      holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_events_hosting_adpt_title); 
      holder.tvTime = (TextView) convertView.findViewById(R.id.tv_events_hosting_adpt_time); 
      holder.tvLocation = (TextView) convertView.findViewById(R.id.tv_events_hosting_adpt_city); 
      holder.rlEnable = (RelativeLayout) convertView.findViewById(R.id.rl_events_hosting_adpt_enable); 
      holder.rlDisable = (RelativeLayout) convertView.findViewById(R.id.rl_events_hosting_adpt_disable); 

      convertView.setTag(holder); 
     } 
     else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if(rowItem.getIsActive().equalsIgnoreCase("true")){ 
      holder.rlDisable.setVisibility(View.VISIBLE); 
      holder.rlEnable.setVisibility(View.GONE); 
     }else { 
      holder.rlDisable.setVisibility(View.GONE); 
      holder.rlEnable.setVisibility(View.VISIBLE); 
     } 

     if(rowItem.getTitleMyEvent().equals(null) || rowItem.getTitleMyEvent().equals("")){ 
      holder.tvTitle.setText("-"); 
     }else { 
      holder.tvTitle.setText(rowItem.getTitleMyEvent()); 
     } 

     if(rowItem.getTimeMyEvent().equals(null) || rowItem.getTimeMyEvent().equals("")){ 
      holder.tvTime.setText("-"); 
     }else { 
      holder.tvTime.setText(rowItem.getTimeMyEvent()); 
     } 

     if(rowItem.getLocationMyEvent().equals(null) || rowItem.getLocationMyEvent().equals("")){ 
      holder.tvLocation.setText("-"); 
     }else { 
      holder.tvLocation.setText(rowItem.getLocationMyEvent()); 
     } 


     if(rowItem.getImageMyEvent().equals(null) || rowItem.getImageMyEvent().equals("")){ 

     }else { 

      Glide.with(context).load(rowItem.getImageMyEvent()).placeholder(R.drawable.loading_img).error(R.drawable.bg_480_800).into(holder.eventImage); 

     } 

     final ViewHolder finalHolder = holder; 
     holder.rlDisable.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       eventIdForVol = rowItem.getEventID(); 

       Log.e("eventIdForVol", eventIdForVol); 

       disableVolley(finalHolder); 

      } 
     }); 

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

      @Override 
      public void onClick(View v) { 

       eventIdForVol = rowItem.getEventID(); 

       Log.e("eventIdForVol", eventIdForVol); 

       enableVolley(finalHolder); 

      } 
     }); 

     return convertView; 
    } 

    private class ViewHolder { 
     ImageView eventImage; 
     TextView tvTitle; 
     TextView tvTime; 
     TextView tvLocation; 
     RelativeLayout rlEnable; 
     RelativeLayout rlDisable; 
    } 
} 

Pojo класс

public class EventMyEventHostingItems { 

    private String eventID; 
    private String imageMyEvent; 
    private String isActive; 
    private String titleMyEvent; 
    private String timeMyEvent; 
    private String locationMyEvent; 
    private String interestedMyEvent; 





    public String getEventID() { 
     return eventID; 
    } 
    public void setEventID(String eventID) { 
     this.eventID = eventID; 
    } 
    public String getIsActive() { 
     return isActive; 
    } 
    public void setIsActive(String isActive) { 
     this.isActive = isActive; 
    } 
    public String getImageMyEvent() { 
     return imageMyEvent; 
    } 
    public void setImageMyEvent(String imageMyEvent) { 
     this.imageMyEvent = imageMyEvent; 
    } 
    public String getTitleMyEvent() { 
     return titleMyEvent; 
    } 
    public void setTitleMyEvent(String titleMyEvent) { 
     this.titleMyEvent = titleMyEvent; 
    } 
    public String getTimeMyEvent() { 
     return timeMyEvent; 
    } 
    public void setTimeMyEvent(String timeMyEvent) { 
     this.timeMyEvent = timeMyEvent; 
    } 
    public String getLocationMyEvent() { 
     return locationMyEvent; 
    } 
    public void setLocationMyEvent(String locationMyEvent) { 
     this.locationMyEvent = locationMyEvent; 
    } 
    public String getInterestedMyEvent() { 
     return interestedMyEvent; 
    } 
    public void setInterestedMyEvent(String interestedMyEvent) { 
     this.interestedMyEvent = interestedMyEvent; 
    } 
} 
+1

Пожалуйста, уменьшите это до короткого, но полного примера, демонстрирующего проблему. Нет необходимости в этом количестве кода –

ответ

0

Я старался достичь этого один, но, как я уже говорил, что это не возможно достичь (на данный момент). Таким образом, я достиг в этом answer

Объяснения

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

Parcelable state; 

@Override 
public void onPause() {  
    // Save ListView state @ onPause 
    Log.d(TAG, "saving listview state @ onPause"); 
    state = listView.onSaveInstanceState(); 
    super.onPause(); 
} 
... 

@Override 
public void onViewCreated(final View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    // Set new items 
    listView.setAdapter(adapter); 
    ... 
    // Restore previous state (including selected item index and scroll position) 
    if(state != null) { 
     Log.d(TAG, "trying to restore listview state.."); 
     listView.onRestoreInstanceState(state); 
    } 
} 
0

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

private void updateView(int index){ 
    View v = yourListView.getChildAt(index - 
     yourListView.getFirstVisiblePosition()); 

    if(v == null) 
     return; 

    // Views you want to change 
    TextView someText = (TextView) v.findViewById(R.id.sometextview); 
    someText.setText("UPDATE"); 
} 
+0

здесь индекс означает позицию справа? – Bahu