2016-09-23 9 views
13

सारांशएंड्रॉयड - छवियों के लिए दृश्य जोड़ना अपडेट नहीं करता - onClick

एक उपयोगकर्ता RecyclerView आइटम पर क्लिक करता है, मैं जानकारी है कि एक BAAS में जमा किया गया है कि छवि के लिए टैग जोड़ने के लिए चाहते हैं [सशिडो] (एक्स समन्वय, वाई समन्वय और टैग नाम)। लेकिन, मेरी समस्या यह है कि प्रतिभा स्थिति नहीं मिल रही है। जब छवि पर क्लिक किया गया है तो मैं एक टोस्ट बना देता हूं, यह दृश्य के अनुरूप सही स्थिति दिखाता है। (शुरुआत के लिए शून्य, इतने पर और आगे)

लेकिन जब उपयोगकर्ता सूची में किसी अन्य आइटम पर क्लिक करता है तो स्थिति को अपडेट करने के लिए, ताकि टैग सशिडो में सरणी में स्थिति से मेल खाते हों, मिलान करें RecyclerView में स्थिति, क्योंकि फिलहाल सशिडो वर्ग की पहली पंक्ति उस पंक्ति के टैग के साथ सभी छवियों को पॉप्युलेट कर रही है।

मेरे धारणा पास करने के लिए getLayoutPosition() का उपयोग कर इतनी है कि जब objects.get(position) सरणी कहा जाता है, यह Sashido वर्ग के लिए एक ही स्थिति मिलेगा getTagInformation() विधि के लिए स्थिति थी, लेकिन ऐसा नहीं है। मुझे लगता है कि उपयोगकर्ता ने किसी नए आइटम पर क्लिक करने के बाद एडाप्टर को सही ढंग से अपडेट नहीं किया जाना चाहिए।

onBindViewHolder:

@Override 
public void onBindViewHolder(RecyclerViewHolderPreviousPosts holder, int position) { 
    holder.bind(previousPostsList.get(position), listener); 
} 

onBind:

void bind(final PreviousPostsDataModel model, final OnItemClickListener listener) { ... 

uploadedImage.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         if (count == 0) { 
          imageid = model.getImageId(); 
          Toast.makeText(App.getContext(), "Image ID: " + imageid, Toast.LENGTH_SHORT).show(); 
          Toast.makeText(App.getContext(), "Position: " + getAdapterPosition(), Toast.LENGTH_SHORT).show(); 
          getTagInformation(getLayoutPosition()); 
         } else { 
          Log.e("qwert", "" + imageid); 
          imageContainer.removeAllViews(); 
          imageContainer.addView(uploadedImage); 
          count = 0; 
         } 
       } 
      }); 
... } 

getTagInformation:

private void getTagInformation(final int position) { 
       ParseQuery<ParseObject> query = ParseQuery.getQuery("FashionFeed"); 
       query.findInBackground(new FindCallback<ParseObject>() { 
        @Override 
        public void done(List<ParseObject> objects, ParseException e) { 
         if (e == null) { 
          Toast.makeText(context, "" + position, Toast.LENGTH_SHORT).show(); 
          JSONArray tagNamesArray = objects.get(position).getJSONArray("tagName"); 
          JSONArray posXArray = objects.get(position).getJSONArray("tagPointX"); 
          JSONArray posYArray = objects.get(position).getJSONArray("tagPointY"); 

          for (int i = 0; i < tagNamesArray.length(); i++) { 
           for (int t = 0; t < tagNamesArray.length(); t++) { 
            tagNames.add(tagNamesArray.optString(t)); 
            tagXPositions.add(posXArray.optString(t)); 
            tagYPositions.add(posYArray.optString(t)); 

           } 

           for (int o = 0; o < tagNamesArray.length(); o++) { 
            tag = new TextView(App.getContext()); 
            tag.setX(Float.parseFloat(tagXPositions.get(o))); 
            tag.setY(Float.parseFloat(tagYPositions.get(o))); 
            tag.setText(tagNames.get(o)); 
            tag.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
            tag.setMaxLines(1); 
            tag.setTextSize(11); 
            tag.setClickable(true); 
            tag.setHintTextColor(Color.WHITE); 
            tag.setTextColor(Color.WHITE); 
            tag.setBackgroundResource(R.drawable.tags_rounded_corners); 
            imageContainer.addView(tag); 
            count = 1; 
           } 
          } 
         } else { 
          Toast.makeText(context, "" + e.getMessage(), Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 
     } 

मैं भी है टी रीड

public void getTagInformation(String imageid) { 
ParseQuery query = ParseQuery.getQuery("FashionFeed"); 
query.WhereEqualTo("objectId", imageId); 
.... 
} 

imageId विधि में पारित कर दिया साथ और मुझे भी मैन्युअल रूप से एक objectId में प्रवेश कि मिलान कर देंगे करने के बावजूद, केवल टैग है कि उस objectId के हैं उत्पादन होगा। ऐसा लगता है कि यह क्वेरी सभी वस्तुओं के माध्यम से जा रही है। बस उस ऑब्जेक्ट से टैग जानकारी प्राप्त करना और फिर उन छवियों के साथ सभी छवियों को सेट करना।

यदि आपको मुझे कोड प्रदान करने की आवश्यकता है, तो मैं खुश हूं।

उत्तर

1

समस्या हल हो गई। यह इतना स्थिति गलत थी नहीं था, यह था, क्योंकि मैं टैग इससे पहले कि मैं पार्स के FindInBackground() कॉलबैक के कारण छवियों की सूची को आबाद करने गया था, यह अभी तक बहुत देर हो चुकी आबादी किया जा रहा था खोजने की कोशिश कर रहा था।

समाधान यह था कि मुझे JSONArray मिला जिसमें टैग नाम, एक्स-समन्वय और वाई समन्वय मूल क्वेरी के अंदर शामिल थे जो छवियों की मूल सूची को पॉप्युलेट कर रहा था। तो वे एक साथ निष्पादित करेंगे, फिर मैंने JSONArray मानों को model में पारित किया, जिसे Adapter में bind() फ़ंक्शन में पारित किया गया था।

इससे पहले, समस्या यह थी कि एडाप्टर प्रत्येक छवि पर सभी टैग बाध्यकारी था, इसलिए जब छवि पर क्लिक ईवेंट हुआ तो यह केवल imageContainer पर टैग जोड़ देगा जो वर्तमान में चयनित था (वर्तमान स्थिति में) , किसी भी विशेष स्थिति में कोई आंशिक दृश्य नहीं।

इसने इसे हर बार बनाया था जब छवि पर क्लिक किया गया था, यह हमेशा डेटाबेस में पहली वस्तु ढूंढ रहा था और इसे चयनित छवि को असाइन कर रहा था। [getTagInformation() फ़ंक्शन ट्रिगर करने वाले क्लिक ईवेंट के कारण)।

RecyclerView धारक: ViewHolder की Bind समारोह के भीतर getTagInformation विधि के स्वचालन के साथ, मैं सही टैग के साथ हर छवि को पॉप्युलेट और आगे एक onClickListener छवि को सौंपा का उपयोग कर इसे हेरफेर करने में सक्षम के रूप में नीचे दिखाया गया था:

public class RecyclerViewHolderPreviousPosts extends RecyclerView.ViewHolder implements View.OnClickListener { 
     // View holder for gridview recycler view as we used in listview 
     public TextView createdAt; 
     public ImageView uploadedImage; 
     public TextView caption; 
     TextView number_of_likes; 
     TextView number_of_comments; 
     TextView number_of_tags; 
     public ImageView comments; 
     public RelativeLayout imageContainer; 


    RecyclerViewHolderPreviousPosts(View view) { 
     super(view); 
     // Find all views ids 
     this.createdAt = (TextView) view 
       .findViewById(R.id.created_date); 
     this.uploadedImage = (ImageView) view 
       .findViewById(R.id.image); 
     this.caption = (TextView) view 
       .findViewById(R.id.caption_post); 
     this.number_of_likes = (TextView) view 
       .findViewById(R.id.number_of_likes); 
     this.number_of_comments = (TextView) view 
       .findViewById(R.id.number_of_comments); 
     this.number_of_tags = (TextView) view 
       .findViewById(R.id.number_of_tags); 
     this.comments = (ImageView) view 
       .findViewById(R.id.comments_image); 
     this.imageContainer = (RelativeLayout) view 
       .findViewById(R.id.image_container); 
     view.setOnClickListener(this); 
    } 

    void bind(PreviousPostsDataModel model1, final int position) { .... 
     model = previousPostsList.get(position); 
     getTagInformation(); 
....} 

    private void getTagInformation() { 
     for (int o = 0; o < model.getTagSize(); o++) { 
      tag = new TextView(App.getContext()); 
      tag.setX(Float.parseFloat(model.getXpoints(o))); 
      tag.setY(Float.parseFloat(model.getYpoints(o))); 
      Log.e("x", "" + tag.getX()); 
      Log.e("y", "" + tag.getY()); 
      tag.setText(model.getTagName(o)); 
      tag.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
      tag.setMaxLines(1); 
      tag.setTextSize(11); 
      tag.setClickable(true); 
      tag.setHintTextColor(Color.WHITE); 
      tag.setTextColor(Color.WHITE); 
      tag.setBackgroundResource(R.drawable.tags_rounded_corners); 
      imageContainer.addView(tag); 
      tags.add(tag); 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     if (count == 0) { 
      for (int i = 0; i < tags.size(); i++) { 
       tags.get(i).setVisibility(View.INVISIBLE); 
      } 
      count = 1; 
     } 
     else { 
      for (int j = 0; j < tags.size(); j++) { 
       tags.get(j).setVisibility(View.VISIBLE); 
      } 
      count = 0; 
     } 
    } 
} 

प्रोफाइल टुकड़ा [मूल क्वेरी]:

private void populateSelectedUserRecyclerView(String objectid) { 
     ParseQuery<ParseObject> query = ParseQuery.getQuery("FashionFeed"); 
     query.whereEqualTo("uploader", ParseObject.createWithoutData("_User", objectid)); 
     query.orderByDescending("createdAt"); 
     Log.e("get order", "ordered"); 
     query.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(List<ParseObject> objects, ParseException e) { 
       Log.e("gets done", "gets into done"); 
       if(e == null) { 
        if (objects.size() > 0) { 
         Log.e("does it get here", "it got here"); 

         latestPostList = new ArrayList<>(); 
         for (ParseObject j : objects) { 
          JSONArray tagNamesArray = j.getJSONArray("tagName"); 
          JSONArray posXArray = j.getJSONArray("tagPointX"); 
          JSONArray posYArray = j.getJSONArray("tagPointY"); 
          latestPostList.add(new PreviousPostsDataModel(tagNamesArray, posXArray, posYArray)); 
         } 
        } 
        else { 
         no_follow_display.setVisibility(View.VISIBLE); 
         no_follow_display.setText(R.string.no_posts); 
         no_follow_display.bringToFront(); 
         recyclerView.setVisibility(View.GONE); 
        } 

        adapter = new RecyclerViewAdapterPreviousPosts(getActivity(), latestPostList, listener); 
        recyclerView.setAdapter(adapter);// set adapter on recyclerview 

        adapter.notifyDataSetChanged(); 
       } 
       else { 
        Log.e("failed", "failed" + e.getMessage()); 
       } 
      } 
     }); 
    } 

आपकी मदद के लिए धन्यवाद।

0

यदि मैं सही ढंग से सवाल समझता हूं कि समस्या यह है कि ParseQuery ऑब्जेक्ट को उसी क्रम में वापस नहीं करता है। तो धारणाएं कि आपके रीसायकल व्यू में ऑब्जेक्ट की स्थिति समान है जैसा कि ParseDatabase में गलत है।

यदि आप सशिडो से TAG प्राप्त करना चाहते हैं तो आपको पहले छवियों जैसे अतिरिक्त कॉलम को कुछ संबंध बनाना चाहिए। तब क्वेरी सफेद अतिरिक्त पैरामीटर की तरह करते हैं:

private static final String UNIQ_TAG_ID= "tagId"; query.whereContainedIn(UNIQ_TAG_ID, id);

या यू की तरह सभी ParseObjects अब क्या कर रही हो और कि टैग कि आपकी छवि के अनुरूप मिल जाए, तो जानकारी ले।

+0

मैंने यह किया, अगर मैं डेटाबेस से मैन्युअल रूप से ऑब्जेक्ट डालता हूं, तो सही टैग दिखाए जाते हैं लेकिन फिर भी सभी छवियों के लिए दिखाई देते हैं। तो मुझे विश्वास नहीं है कि यह सवाल है। मुझे इसकी सारी जानकारी मिल रही है, लेकिन टैग के केवल एक सेट के लिए। निश्चित रूप से यह 'getTagInformation()' विधि के बाहर होना चाहिए। – BIW

4

हाय @BIW लिंक link

नीचे का पालन करें onBindViewHolder में, आप श्रोता हर बार जोड़ रहे हैं, तो यह एक ही वस्तु हर बार recyclerView ViewHolder पैटर्न एक ही वस्तु का उपयोग करता है के रूप में onBindViewHolder में recyclerView आइटम प्रस्तुत करने के लिए देता है।इसलिए जब आप होल्डर ऑब्जेक्ट बना रहे हैं और श्रोता को सेट करते हैं तो आपको जोड़ना होगा ताकि आपको उचित स्थिति मिल सके।

package com.subbu.moviemasti.adapter; 

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 

import com.squareup.picasso.Picasso; 
import com.subbu.moviemasti.Constants; 
import com.subbu.moviemasti.R; 
import com.subbu.moviemasti.entities.Movie; 

import java.util.List; 

import butterknife.Bind; 
import butterknife.ButterKnife; 

/** 
* Created by subrahmanyam on 25-11-2015. 
*/ 
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.ViewHolder> { 

    private final List<Movie> movieList; 
    private onRecyclerViewItemClickListener mItemClickListener; 

    public MovieAdapter(List<Movie> movieList) { 
     this.movieList = movieList; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.grid_item, null); 
     ViewHolder holder = new ViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     final Movie movie = movieList.get(position); 
     String imageUrl = Constants.MOVIE_POSTER_BASE_URL + movie.getPosterPath(); 
     if (imageUrl != null) { 
      Picasso.with(holder.posterImage.getContext()).load(imageUrl). 
        placeholder(R.drawable.img_default). 
        into(holder.posterImage); 
     } 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public int getItemCount() { 
     return movieList.size(); 
    } 

    public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
    } 

    public interface onRecyclerViewItemClickListener { 
     void onItemClickListener(View view, int position); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     @Bind(R.id.poster) 
     ImageView posterImage; 

     public ViewHolder(View view) { 
      super(view); 
      ButterKnife.bind(this, view); 
      view.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      mItemClickListener.onItemClickListener(v, getAdapterPosition()); 
     } 
    } 

} 

हम कहाँ adaper वस्तु बना रहे हैं, वहाँ से हम जैसे adapter.setOnItemClickListener(this)

class MyActivity extendsActivity implements onRecyclerViewItemClickListener { 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 
    manager = new GridLayoutManager(getActivity(), cols); 
      gridView.setLayoutManager(manager); 
gridView.setAdapter(adapter); 
adapter.setOnItemClickListener(this); 
} 
@Override 
     public void onItemClickListener(View view, int position) { 
      //Do wantever you want to do 
     } 
} 

ViewHolder वर्ग से श्रोता स्थापित करने के लिए हम एक recyclerView की position पास करनी होगी हम कोड लिख सकते हैं कि तुम क्या जरूरत की जरूरत है या आइटम पर क्लिक करते समय निष्पादित करने के लिए।

+0

और जहां यह मेरे लिए 'क्लिक' के अंदर चर्चा करते हुए किया जाएगा? भले ही उत्तर सही है, लिंक भविष्य में किसी भी समय आसानी से टूट सकता है और जानकारी समाप्त हो जाएगी। क्या आप अपने उत्तर को सही संदर्भों के साथ अपडेट कर सकते हैं कि आप मुझे क्या करना चाहते हैं? – BIW

+0

ज़रूर मैं कोड –

+0

साथ अद्यतन करेगा आप और अधिक विस्तृत करने की आवश्यकता होगी, तो आप सिर्फ कॉपी नहीं कर सकते और अपने खुद के कोड पेस्ट करें। मुझे आपको यह बताने की ज़रूरत है कि यह मेरी स्थिति से कैसे संबंधित है और उदाहरण के लिए मेरी तुलना में मेरा काम क्यों नहीं कर रहा है? मैं इस समस्या को सीखना चाहता हूं इसलिए मैं इसे फिर से नहीं चलाता, मैं एक त्वरित फिक्स नहीं ढूंढ रहा हूं और इसे ठीक करने का आसान तरीका नहीं ढूंढ रहा हूं, मैं सीखना चाहता हूं कि मेरा यह कैसा है। – BIW

संबंधित मुद्दे