2016-09-23 50 views
13

Tóm tắtAndroid - Thêm xem để hình ảnh không cập nhật - onClick

Khi người dùng nhấp vào RecyclerView mục, tôi muốn thêm thẻ vào hình ảnh đó từ những thông tin đã được lưu trữ trong một Baas [Sashido] (tọa độ X, toạ độ Y và tên thẻ). Nhưng, vấn đề tôi đang gặp phải là không nhận được vị trí. Tôi tạo ra một bánh mì nướng khi hình ảnh đã được nhấp, nó cho thấy vị trí chính xác tương ứng với chính khung nhìn đó. (0 cho số đầu, vv ..)

Nhưng cách cập nhật vị trí khi người dùng bấm vào một mục khác trong danh sách, sao cho các thẻ tương ứng với vị trí trong mảng trong Sashido, khớp với vị trí trong RecyclerView, bởi vì tại thời điểm hàng đầu tiên trong lớp Sashido là phổ biến tất cả các hình ảnh với các thẻ của hàng đó.

Giả định của tôi là chuyển vị trí đến phương thức getTagInformation() bằng cách sử dụng getLayoutPosition() để khi được gọi là objects.get(position) mảng, nó sẽ có cùng vị trí cho lớp Sashido nhưng không phải. Tôi cảm thấy bộ điều hợp không được cập nhật chính xác sau khi người dùng đã nhấp vào một mục mới.

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ôi cũng có t Ried

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

với imageId truyền vào phương pháp và với tôi cũng tự nhập một objectId rằng sẽ phù hợp, nó sẽ vẫn chỉ sản xuất các thẻ thuộc về objectId đó. nó dường như không phải là truy vấn này đang trải qua tất cả các đối tượng. Chỉ cần lấy thông tin thẻ từ một đối tượng đó và sau đó đặt tất cả các hình ảnh với các thẻ đó.

nếu bạn cần tôi cung cấp mã nữa, tôi rất vui.

Trả lời

1

Giải quyết sự cố. Nó không phải là quá nhiều mà vị trí đã sai, đó là bởi vì tôi đã cố gắng để tìm các thẻ trước khi tôi đã được điền vào danh sách các hình ảnh do Parse của FindInBackground() gọi lại, nó đã được dân cư quá muộn.

Giải pháp là tôi đã nhận được JSONArray chứa các tên Thẻ, toạ độ x và các tọa độ y bên trong truy vấn ban đầu đã điền vào danh sách hình ảnh ban đầu. Vì vậy, chúng sẽ thực thi đồng thời, sau đó tôi đã chuyển các giá trị JSONArray vào số model, sau đó được chuyển đến hàm bind() trong số Adapter.

Trước đó, sự cố là bộ điều hợp đã ràng buộc tất cả các thẻ trên mọi hình ảnh, vì vậy khi sự kiện nhấp xảy ra trên hình ảnh, nó sẽ chỉ thêm thẻ vào số imageContainer hiện được chọn (ở vị trí hiện tại) , không phải bất kỳ quan điểm bán phần nào ở bất kỳ vị trí cụ thể nào.

Điều này làm cho nó như vậy mỗi khi hình ảnh được nhấp vào nó luôn tìm đối tượng đầu tiên trong cơ sở dữ liệu và gán nó cho hình ảnh đã chọn. [do sự kiện nhấp chuột kích hoạt chức năng getTagInformation()). Với sự tự động hóa các phương pháp getTagInformation trong Bind chức năng của ViewHolder, tôi đã có thể để cư mỗi hình ảnh với các thẻ đúng và tiếp tục vận dụng nó sử dụng một onClickListener gán cho hình ảnh như hình dưới đây:

RecyclerView Chủ:

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

Hồ sơ 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()); 
       } 
      } 
     }); 
    } 

Cảm ơn sự giúp đỡ của bạn.

0

Nếu tôi hiểu chính xác câu hỏi vấn đề là ParseQuery không trả về các đối tượng theo cùng thứ tự. Vì vậy, các giả định rằng vị trí của đối tượng trong RecycleView của bạn giống như trong ParseDatabase là sai.

Nếu bạn muốn nhận TAG từ Sashido Trước tiên, bạn nên tạo một số mối quan hệ với Hình ảnh, ví dụ: cột bổ sung. Sau đó thực hiện truy vấn tham số thêm trắng như:

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

hoặc nhận Tất cả ParseObjects như u làm gì bây giờ và thấy rằng TAG tương ứng với hình ảnh của bạn, sau đó đi thông tin.

+0

Tôi đã làm điều này, nếu tôi đặt thủ công đối tượngId từ cơ sở dữ liệu, các thẻ chính xác sẽ hiển thị nhưng vẫn hiển thị cho tất cả các hình ảnh. Vì vậy, tôi không tin đó là truy vấn. nó nhận được tất cả thông tin tôi cần, nhưng chỉ cho một bộ thẻ. chắc chắn nó phải nằm ngoài phương thức 'getTagInformation()'. – BIW

4

Hi @BIW hãy làm theo bên dưới liên kết link

Trong onBindViewHolder, bạn đang thêm người nghe mỗi lần, vì vậy nó sẽ trả về cùng một đối tượng mỗi lần như recyclerView ViewHolder mẫu sử dụng cùng một đối tượng để render recyclerView mục trong onBindViewHolder.Vì vậy, bạn cần phải thêm khi bạn đang tạo đối tượng chủ và đặt trình nghe cho nó để bạn sẽ có được vị trí thích hợp.

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

} 

đâu chúng ta đang tạo đối tượng adaper, từ đó chúng ta cần phải thiết lập listener như 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 
     } 
} 

Từ lớp ViewHolder chúng tôi cần phải vượt qua position của một recyclerView hoặc chúng ta có thể viết mã những gì bạn cần để thực hiện khi nhấp vào mục.

+0

và bạn sẽ đề cập đến ai bên trong 'liên kết' này? ngay cả khi câu trả lời là chính xác, liên kết có thể dễ dàng phá vỡ bất cứ lúc nào trong tương lai và thông tin sẽ biến mất. bạn có thể cập nhật câu trả lời của mình với các tham chiếu chính xác về những gì bạn muốn tôi theo dõi không? – BIW

+0

Chắc chắn tôi sẽ cập nhật mã số –

+0

Bạn sẽ cần phải xây dựng thêm, bạn không thể chỉ sao chép và dán mã của riêng bạn. Tôi cần bạn giải thích làm thế nào điều này liên quan đến tình hình của tôi và tại sao tôi không làm việc so với của bạn, ví dụ? Tôi muốn tìm hiểu vấn đề này vì vậy tôi không chạy vào nó một lần nữa, tôi không tìm kiếm một sửa chữa nhanh chóng cũng không dễ dàng để sửa chữa nó, tôi đang tìm hiểu tại sao tôi là như thế nào. – BIW

Các vấn đề liên quan