刷新列表视图中的特定项目

Refresh particular item in the list view

我试图在不刷新整个列表视图的情况下更新列表视图中的特定项目(下面有清楚的解释)。对于这个要求,我放弃了几乎所有在线可用的想法,但我没有得到解决方案

解释:

我在列表视图中有不同的项目(见附图)。对于此列表视图,我使用模型 class (POJO class) 存储 ID 和其他相关数据。在同一个项目中,我正在使用推送通知。在此推送通知中,我获取了列表视图中项目的 ID。根据 id,我必须在列表视图中显示一些图像。对于此要求,如果我刷新整个列表视图,我可以更改图像,但我不想刷新整个列表视图。 所以,我想根据从推送通知中获得的 ID 更改列表视图中特定项目的图像

图片

示例代码(我正在使用下面的示例代码来填充列表视图)

Activity

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)
    ===================================================================

    

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

波乔class

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

您可以使用以下代码:

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

我努力实现这一目标,但正如我所提到的,这是不可能实现的(截至目前)。所以,我实现了这个 answer

说明

当我收到推送通知时,我只是调用包含我的 ListView 值的 API 并像下面的代码一样维护 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);
    }
}