2016-09-23 1 views
13

ZusammenfassungAndroid - Ansichten auf dem Hinzufügen von Bildern nicht aktualisiert - onClick

Wenn ein Benutzer auf das RecyclerView Element klickt, würde ich Tags wie aus den Informationen zu diesem Bild hinzuzufügen, die in einem BaaS gespeichert wurden [Sashido] (X-Koordinaten, Y-Koordinaten und Tag-Name). Aber das Problem, das ich habe, ist nicht die Position per-say. Ich erstelle einen Toast, wenn das Bild angeklickt wurde, es zeigt die korrekte Position an, die der Ansicht selbst entspricht. (Null für den Anfang, so weiter und so weiter)

Aber wie man die Position aktualisiert, sobald der Benutzer auf ein anderes Element in der Liste klickt, damit die Tags, die der Position im Array in Sashido entsprechen, übereinstimmen Position in der RecyclerView, weil im Moment die erste Zeile in der Sashido-Klasse alle Bilder mit den Tags dieser Zeile bevölkert.

Meine Vermutung war auf der Passhöhe die Position in die getTagInformation() Methode getLayoutPosition() so, dass, wenn objects.get(position) Array genannt wird, wird es die gleiche Position für Sashido Klasse erhalten, aber es ist nicht. Ich denke, der Adapter muss nicht korrekt aktualisiert werden, nachdem der Benutzer auf ein neues Element geklickt hat.

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

Ich habe auch t ried

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

mit den imageId in die Methode übergeben und mit auch passe auf manuell ein objectId Eingabe, die ich, wird es nach wie vor nur die Tags erzeugen, die zu diesen objectId gehören. Es scheint einfach nicht, dass diese Abfrage alle Objekte durchläuft. Ermittelt nur die Tag-Informationen von diesem einen Objekt und setzt dann alle Bilder mit diesen Tags.

Wenn Sie mich brauchen, um mehr Code zur Verfügung zu stellen, bin ich mehr als glücklich.

Antwort

1

Das Problem wurde behoben. Es war nicht so, dass die Position falsch war, weil ich versuchte, die Tags zu finden, bevor ich die Liste der Bilder aufgrund von Parses FindInBackground() Callbacks füllte, wurde es viel zu spät bevölkert.

Die Lösung war, dass ich die JSONArray, die die Tag-Namen, X-Coordinates und Y-Koordinaten in der ursprünglichen Abfrage, die die ursprüngliche Liste der Bilder bevölkert enthielt. So würden sie gleichzeitig ausführen, dann habe ich die JSONArray Werte in die model übergeben, die dann an die bind() Funktion in der Adapter übergeben wurde.

Zuvor bestand das Problem darin, dass der Adapter alle Tags an jedes Bild anbot. Wenn das Klickereignis auf dem Bild stattfand, wurde das Tag nur zur aktuell ausgewählten imageContainer hinzugefügt (an der aktuellen Position). , keine bestimmte Ansicht in einer bestimmten Position.

Dies machte es so jedes Mal, wenn das Bild angeklickt wurde, fand es immer das erste Objekt in der Datenbank und ordnete es dem ausgewählten Bild zu. [aufgrund des Klickereignisses, das die getTagInformation()-Funktion auslöst]. Mit der Automatisierung des getTagInformation Verfahrens innerhalb der Bind Funktion der ViewHolder, ich war jedes Bild mit den richtigen Tags füllen kann und es weiterhin ein onClickListener zu dem Bild einzuzusetzendes manipulieren, wie unten dargestellt:

RecyclerView Halter :

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

Profil Fragment [Original query]:

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

Danke für Ihre Hilfe.

0

Wenn ich richtig verstehe, ist das Problem, dass ParseQuery keine Objekte in der gleichen Reihenfolge zurückgeben. Die Annahmen, dass die Position des Objekts in Ihrem RecycleView dieselbe ist wie in ParseDatabase, sind falsch.

Wenn Sie TAG von Sashido erhalten möchten, sollten Sie zunächst einige Beziehungen zu Images z. B. zusätzliche Spalte herstellen. Dann Abfrage wissen zusätzliche Parameter machen wie:

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

oder Alle ParseObjects wie u jetzt gerade bekommen und den TAG finden, die Ihr Bild entsprechen, dann info nehmen.

+0

Ich tat dies, wenn ich die objectId manuell aus der Datenbank einfüge, die richtigen Tags erscheinen aber immer noch für alle Bilder. Also ich glaube nicht, dass es die Abfrage ist. es bekommt alle Informationen, die ich brauche, aber für nur einen Satz von Tags. sicherlich muss es außerhalb der 'getTagInformation()' Methode sein. – BIW

4

Hallo @BIW folgen Sie bitte folgenden Link link

In onBindViewHolder Sie Hörer hinzufügen jedes Mal, so dass es wieder gleiches Objekt jedes Mal, als recyclerView ViewHolder Muster gleiches Objekt verwendet recyclerView Element in onBindViewHolder zu machen.Sie müssen also hinzufügen, wenn Sie ein Halterobjekt erstellen und den Listener so einstellen, dass Sie eine korrekte Position erhalten.

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

} 

Wo wir adaper Objekt erstellen, von dort müssen wir Zuhörer setzen wie 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 
     } 
} 

Von ViewHolder Klasse brauchen wir position eines recyclerView passieren, oder wir können Code schreiben, was Sie brauchen auszuführen, wenn Sie auf ein Element klicken.

+0

und wo würdest du dich in diesem "Link" auf mich beziehen? Selbst wenn die Antwort richtig ist, könnte die Verbindung jederzeit in der Zukunft brechen und die Information wird weg sein. Kannst du deine Antwort mit den richtigen Verweisen auf das, was du mir folgen möchtest, aktualisieren? – BIW

+0

Sicher werde ich mit Code –

+0

aktualisieren Sie müssen mehr erarbeiten, Sie können nicht einfach kopieren und fügen Sie Ihren eigenen Code. Ich brauche Sie zu erklären, wie sich dies auf meine Situation bezieht und warum meine im Vergleich zu Ihrer nicht arbeitet, zum Beispiel? Ich möchte dieses Problem lernen, damit ich es nicht noch einmal anführe. Ich suche weder nach einer schnellen Lösung noch nach einer einfachen Lösung. Ich möchte herausfinden, warum es so ist. – BIW

Verwandte Themen