2016-09-23 1 views
13

사용자가 RecyclerView 항목을 클릭안드로이드 - 이미지에 뷰를 추가하는 업데이트하지 않습니다 - 온 클릭을

, 나는이 BAAS에 저장된 정보에서 해당 이미지에 태그를 추가하고 싶습니다 요약 [Sashido] (X 좌표, Y 좌표 및 태그 이름). 하지만, 내가 겪고있는 문제는 말로는 입장을 얻지 못하고있다. 이미지를 클릭 할 때 토스트를 만들고 뷰 자체에 해당하는 올바른 위치를 표시합니다. (시작 부분은 0 등)

그러나 사용자가 목록의 다른 항목을 클릭하면 Sashido의 배열 위치에 해당하는 태그가 일치하도록 위치를 업데이트하는 방법 위치는 RecyclerView입니다. Sashido 클래스의 첫 번째 행은 모든 이미지에 해당 행의 태그를 채우고 있기 때문입니다.

내 가정은 패스 objects.get(position) 배열이 호출 될 때 그래서, 그것은 Sashido 클래스의 같은 위치를 얻을 수 있습니다 것을 getLayoutPosition()를 사용하여 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(); 
         } 
        } 
       }); 
     } 

t 메소드에 전달 된 imageId

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

리 에드도 나 수동으로 일치한다는 objectId를 입력으로, 아직 해당 objectId에 속하는 태그를 생성 할 수 있습니다. 이 쿼리가 모든 개체를 통과하고있는 것 같지 않습니다. 해당 개체에서 태그 정보를 가져온 다음 해당 태그가있는 모든 이미지를 설정하면됩니다.

더 이상 코드를 제공해야하는 경우 더 이상 행복합니다.

답변

1

문제가 해결되었습니다. 위치가 잘못되어있는 것은 아니 었습니다. Parse의 FindInBackground() 콜백으로 인해 이미지 목록을 채우기 전에 태그를 찾으려고했기 때문에 너무 늦게 채워졌습니다.

해결 방법은 원래 이미지 목록을 채우고 있던 원래 쿼리 내에 태그 이름, x-coordindates 및 y 좌표가 포함 된 JSONArray을 얻는 것입니다. 그래서 그들은 동시에 실행할 것이고 modelJSONArray 값을 전달한 다음 Adapter에있는 bind() 함수에 전달했습니다.

이전에는 어댑터가 모든 태그를 모든 이미지에 바인딩 했으므로 이미지에서 click 이벤트가 발생했을 때 현재 위치에있는 imageContainer에만 태그를 추가합니다. 어떤 특정 위치에서 어떤 단편적인 관점도 아닙니다.

이미지를 클릭 할 때마다 항상 데이터베이스의 첫 번째 개체를 찾아 선택한 이미지에 지정했습니다. [getTagInformation() 기능을 트리거하는 클릭 이벤트로 인해).

RecyclerView 보유자 : 아래와 같이 ViewHolderBind 함수 내의 getTagInformation 방법의 자동화 는 I 올바른 태그마다 화상을 채우고 상기 이미지에 할당 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가 동일한 순서로 개체를 반환하지 않는다는 것입니다. 따라서 RecycleView에있는 객체의 위치가 ParseDatabase와 동일하다는 가정이 잘못되었습니다.

만약 당신이 Sashido에서 TAG를 얻길 원한다면 먼저 이미지와 몇 개의 관계, 예를 들어 추가 열을 만들어야합니다. 다음 정보를 가지고,

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

또는 지금하고 유와 같은 모든 ParseObjects을 얻을 귀하의 이미지에 해당하는 태그를 찾습니다 : 다음과 같은 쿼리 흰색 추가 매개 변수를 확인하십시오.

+0

데이터베이스에서 objectId를 수동으로 넣으면 정확한 태그가 나타나지만 여전히 모든 이미지에 표시됩니다. 그래서 나는 그것이 쿼리라고 생각하지 않습니다. 그것은 내가 필요로하는 모든 정보를 얻지 만 오직 한 세트의 태그만을위한 것입니다. 반드시 getTagInformation() 메소드 외부에 있어야합니다. – BIW

4

안녕 @BIW는 청취자에게 모든 시간을 추가하고, onBindViewHolder에서 링크 link

아래에 따르십시오, 그래서 동일한 개체를 recyclerView ViewHolder 패턴이 onBindViewHolder에 recyclerView 항목을 렌더링하기 위해 동일한 개체를 사용하기 때문에 모든 시간을 반환합니다.따라서 홀더 객체를 생성 할 때이를 추가하고 리스너를 설정하여 적절한 위치를 얻을 수 있도록해야합니다. 우리는 recyclerViewposition을 통과해야 ViewHolder 클래스에서 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 
     } 
} 

같은 리스너 을 설정해야 또는 우리는 당신이 필요로 코드를 작성할 수 있습니다 거기에서 우리가 adaper 개체를 만드는

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

} 

항목을 클릭하면 실행됩니다.

+0

그리고이 '링크'에서 내게 어떤 언급을하고 싶습니까? 답변이 맞더라도 나중에 링크가 쉽게 끊어져 정보가 사라질 수 있습니다. 당신이 따라야 할 사항에 대한 정확한 참조로 대답을 업데이트 할 수 있습니까? – BIW

+0

코드로 업데이트합니다. –

+0

더 자세히 설명해야하며, 코드를 복사하여 붙여 넣기 만하면됩니다. 이 상황이 내 상황과 어떻게 관련되어 있는지, 왜 내 작품이 당신 작품과 비교하여 작동하지 않는지 설명해 주실 수 있습니까? 나는이 문제를 배우기를 원한다. 그래서 나는 다시 그것에 빠지지 않는다. 나는 그것을 고칠 빠른 수정이나 쉬운 방법을 찾고 있지 않다. 나는 왜 이것이 나의 존재인지를 배우려하고있다. – BIW

관련 문제